1

早上好,

我在试图弄清楚如何处理我正在从事的项目时遇到问题......

基本上发生的事情是我需要进入一个文本文件,查找某个文本字符串(IE ColumnSeparator = Y)并将其更改为ColumnSeparator = N。
如果“ColumnSeparator=Y/N”不存在,我需要写大约 4-5 行文本来将文本部分添加到文件中。追加就好了。

现在,这是棘手的部分。我正在编辑的这个文件是一个在大约 850 台机器上使用的程序文件的配置,每个文件都有点不同,并且取决于 Window XP 和 Windows 7,它们位于 2 个不同的地方。
在 Windows 7 中,它位于:C:\AS400\s10138fd.ws但在 Windows XP 中,它位于:C:\Program Files\IBM\Client Access\Emulator\Private\AS400.ws

有任何想法吗??

谢谢!!

这是我需要编辑的 *.ws 文件信息:

[Profile]
ID=WS
Description=
Version=9
[Translation]
IBMDefaultView=Y
DefaultView=
IBMDefaultDBCS=Y
DefaultDBCS=
[Communication]
AutoConnect=Y
Link=telnet5250
Session=5250
ForceConfigPanel=N
[Telnet5250]
HostName=S10138fd
Security=Y
HostPortNumber=992
SSLClientAuthentication=Y
CertSelection=AUTOSELECT
AutoReconnect=Y
[5250]
HostCodePage=037-U
PrinterType=IBM3812
[Keyboard]
CuaKeyboard=2
Language=United-States
IBMDefaultKeyboard=N
DefaultKeyboard=C:\AS400\AS400.KMP
[LastExitView]
A=4 1335 -14 896 609 3 13 29 400 0 IBM3270� 37

我需要补充:

[Window]
ViewFlags=CE00
RuleLinePos=0 0
ColumnSeparator=N

这是新脚本:

if exist "c:\as400\s10138fd.ws" (cd \as400)

copy s10138fd.ws temp.ws
echo [Window]>s10138fd.ws
echo ViewFlags=CE00>>s10138fd.ws
echo RuleLinePos=0 0>>s10138fd.ws
echo ColumnSeparator=N>>s10138fd.ws
type temp.ws >>s10138fd.ws
del temp.ws

) ELSE (cd\program files\ibm\client access\emulator\private)

copy as400.ws temp.ws
echo [Window]>as400.ws
echo ViewFlags=CE00>>as400.ws
echo RuleLinePos=0 0>>as400.ws
echo ColumnSeparator=N>>as400.ws
type temp.ws >>as400.ws
del temp.ws
)
pause
4

3 回答 3

2

如果我理解正确,您不需要知道 ColumnSeparator 的原始值,只需将其重置为 N。

使用以下代码保存没有 ColumnSeparator 数据的配置文件副本,其中 configfile 是配置文件:

type configfile | find /v "ColumnSeparator" > configfile.tmp

然后使用简单的回显和重定向将 ColumnSeparator 值附加到文件末尾。

echo ColumnSeparator=N >> configfile.tmp

然后,您可以删除旧的配置文件,并重命名新创建的(configfile.tmp)以替换旧的...


这是更新的脚本:

type configfile | find /v "[Window]" | find /v "ViewFlags" | find /v "RuleLinePos" | find /v "ColumnSeparator">configfile.tmp

echo [Window]>>configfile.tmp
echo ViewFlags=CE00>>configfile.tmp
echo RuleLinePos=0 0>>configfile.tmp
echo ColumnSeparator=N>>configfile.tmp

这应该可以工作,尽管它需要在一个可以找到所需配置文件的脚本中。该find /v命令过滤掉包含所需字符串的行。


再次更新......(再次)

@echo off
setlocal EnableDelayedExpansion
systeminfo | find "OS Name">temp.tmp
for %%a in ('findstr "7" temp.tmp') do set ver=7
if "%ver%" == "7" (
    set file=s10138fd.ws
    set path=C:\AS400\
    )
for %%a in ('findstr "XP" temp.tmp') do set ver=xp
if "%ver%" == "xp" (
    set file=AS400.ws
    set path=C:\Program Files\IBM\Client Access\Emulator\Private\
    )
del temp.tmp
goto find

:find
if not exist "%path%%file%" (
    echo config file does not exist!
    goto end
    )
echo config file exists!
echo proceeding to fix...
goto dumper

:dumper
cd "%path%"
type %file% | find /v "[Window]" | find /v "ViewFlags" | find /v "RuleLinePos" | find /v "ColumnSeparator">configfile.tmp
echo [Window]>>configfile.tmp
echo ViewFlags=CE00>>configfile.tmp
echo RuleLinePos=00>>configfile.tmp
echo ColumnSeparator=N>>configfile.tmp
ren %file% %file%.bk
ren configfile.tmp %file%
echo fixed!
goto end

:end
exit
于 2013-04-01T18:01:31.110 回答
2

所以实际上你只想用批处理脚本有条件地更新一个简单的 INI 文件。

我猜你需要这是一个单文件解决方案,否则(在你的批处理脚本中)你可能会使用类似的东西:

为了完全按照您当前指定的方式进行操作,我为您创建了以下混合(批处理/JScript)
(使用一个文件,并且没有临时文件):

@if (0)==(1) REM BatchScript: 
:INIT
 @ECHO OFF & CLS
:MAIN
 cscript //NoLogo //E:JScript "%~f0"
 GOTO ENDBAT
:ENDBAT
 ECHO        Press any key to exit...&PAUSE>NUL
 GOTO :EOF
@end // JScript:

 var TRG = ['C:\\Program Files\\IBM\\Client Access\\Emulator\\Private\\AS400.ws',
            'C:\\AS400\\s10138fd.ws'
           ],
     rxp = /ColumnSeparator=[YN]/i,
     rep = 'ColumnSeparator=N',
     add = ['[Window]',
            'ViewFlags=CE00',
            'RuleLinePos=0 0',
            'ColumnSeparator=N',
            ''  //empty line
           ].join('\r\n'),

     WSO = WScript.stdout,
     FSO = WScript.CreateObject("Scripting.FileSystemObject"),
                                 ForReading=1, ForWriting=2,
       L = TRG.length, ret = '', flg = 1, HND;


 while(L--){
    if( FSO.FileExists(TRG[L]) ){ TRG = TRG[L]; L = ''; break; }
 } 

 if(L === ''){
    WSO.write('FOUND: '+TRG+'\r\nWorking...\r\n');
    HND=FSO.OpenTextFile(TRG, ForReading);
    while(!HND.AtEndOfStream){
       L=HND.ReadLine();
       if( rxp.test(L) ){ L = L.replace(rxp,rep); flg = 0; }
       ret+= L+'\r\n';
    }  HND.Close();

    if(flg){ ret= ret.replace(/(\r\n)*$/,'\r\n')+add; }

    HND=FSO.OpenTextFile(TRG, ForWriting);
    HND.Write(ret);  HND.Close();

    WSO.write('\r\nDONE!!!\r\n');
 } else {
    WSO.write('ERROR: no file found\r\n');
 }
 

笔记:

  • 不要忘记脚本末尾的空行(可以肯定)并将其命名为' yourExtCommand.bat'。
  • 这个脚本在 W98、W2k、XP/2003、Vista 和 Windows 7(还没有 8,但无论如何都在使用它......)上经过了彻底的测试(包括 JSLint),它就像一个魅力!
  • 此脚本使用 ini 文件本身的位置作为您的“操作系统检测”,因为您指定:
    ' Windows 7 它位于:C:\AS400\s10138fd.ws 在 Windows XP 中,它位于:C:\Program Files\IBM\Client Access\Emulator\Private\AS400.ws '
    ,因此它将更新它找到的第一个文件(这应该是系统上唯一的文件)从 win7 开始('巧妙地'避免对受保护的不必要的访问%programfiles% 目录和触发 UAC)
  • 将 'ColumnSeparator=N' 更改为 'ColumnSeparator=N' 也不是问题,对吧?
    脚本这样做是为了简单起见,因为您指定:'如果“ColumnSeparator=Y/N”不存在,我需要编写约 4-5 行文本以将文本部分添加到文件中', '附加它们到文件的末尾' 和 '查找某个文本字符串 (IE ColumnSeparator=Y) 并将其更改为 ColumnSeparator=N '
  • REM/删除整...Press any key to...行以使其在无人值守的情况下运行。
  • 更新了脚本以巧妙地处理尾随空白行,通过add变量对其进行控制。
  • 如果您想在添加的部分之前有一个空行,请将行更改  add = ['[Window]',
    为  add = ['', '[Window]',(例如)

最后我想指出(部分是为了我自己),显然可以使用inf文件来更新/修改ini文件,方法是:

  • RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 c:\temp\test.inf    (据说“更好”?)

或者

  • RUNDLL32 SETUPX.DLL,LaunchHinfSection DefaultInstall 132 test.inf

(都从批处理脚本中调用)。

inf 文件也可以从批处理脚本/JScript/VBScript 中回显或写入。

这些 inf 文件可能如下所示:

[version]
signature="$CHICAGO$"


[DefaultInstall]
UpdateInis=IniVal


[IniVal]
"C:\temp\whatever.ini",YourSection,"Something=OldValue","Something=NewValue",0

或者:

[Version]
Signature="$CHICAGO$"

[DefaultInstall]
UpdateINIs=Sys.Ini

[Sys.Ini]
System.ini,ReplaceMeWithAppropriateSection,,”MinPs=32”

祝你好运!

于 2013-04-04T05:38:58.563 回答
0

这是我能够开始工作的新脚本!!!

c:
cd \as400
SETLOCAL EnableDelayedExpansion
for /f "tokens=*" %%x in ('dir /b/s/a-d *.ws') do ( 
copy %%x temp.txt
del %%x
Echo [Window]>%%x
Echo ViewFlags=CE00>>%%x
Echo RuleLinePos=0 0 >>%%x
Echo ColumnSeparator=N>>%%x
type temp.txt>>%%x
del temp.txt
)
else (
c:
cd \users
SETLOCAL EnableDelayedExpansion
for /f "tokens=*" %%x in ('dir /b/s/a-d *.ws') do ( 
copy %%x temp.txt
del %%x
Echo [Window]>%%x
Echo ViewFlags=CE00>>%%x
Echo RuleLinePos=0 0 >>%%x
Echo ColumnSeparator=N>>%%x
type temp.txt>>%%x
)
else (
c:
cd \"Documents and Settings"
SETLOCAL EnableDelayedExpansion
for /f "tokens=*" %%x in ('dir /b/s/a-d *.ws') do ( 
copy %%x temp.txt
del %%x
Echo [Window]>%%x
Echo ViewFlags=CE00>>%%x
Echo RuleLinePos=0 0 >>%%x
Echo ColumnSeparator=N>>%%x
type temp.txt>>%%x
del temp.txt
)
于 2013-04-08T19:20:01.267 回答