早上好,
我在试图弄清楚如何处理我正在处理的项目时遇到了问题......
基本上发生的事情是我需要进入文本文件,查找某个文本字符串,(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
答案 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
”。...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
)