替换文本的批处理文件,如果不存在则写入

时间:2013-04-01 14:35:22

标签: batch-file ini

早上好,

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

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

现在,这是棘手的部分。我正在编辑的这个文件是一个用于〜850台机器上的程序文件的配置,每个文件都有一点不同,根据Window XP和Windows 7,它们位于两个不同的位置。登记/> 在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

3 个答案:

答案 0 :(得分:2)

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

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

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

然后使用简单的echo并重定向将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

答案 1 :(得分:2)

实际上,您只是想要使用批处理脚本有条件地更新简单的简单INI文件。

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

为了完全按照您当前的指定进行操作,我为您创建了以下混合(Batch / 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文件本身的位置作为'os-detection',因为您指定了:
    ' Windows 7位于:C:\ AS400 \ s10138fd.ws在Windows XP中,它位于:C:\ Program Files \ IBM \ Client Access \ Emulator \ Private \ AS400.ws '
    因此它会更新它找到的第一个文件(应该是系统上唯一的文件)以win7开头('巧妙'避免不必要地访问受保护的%programfiles%dir并触发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]',(例如)

最后,我想(部分为自己)apparently可以使用inf文件来更新/修改ini文件:

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

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

(均来自批处理脚本)。

inf-file也可以从batchscript / 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”

祝你好运!

答案 2 :(得分: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
)