我正在尝试通过删除INI文件的特定行(在本例中为dbside =行)中的特定3个字符串来创建将编辑ini文件的批处理文件。基本上如果以下任何字符串: DJG,MSC,SBF,ZML,SBI,SGE,SGS,SSB,SUS,SRZ,ZHP,ZSQ,ZSM,实际零增长 在dbside =行中找到它,它将删除它们并保存新的ini文件。
到目前为止,我有:
setlocal enabledelayedexpansion
@for /f "tokens=2*" %%a in ('REG Query "HKCU\SOFTWARE\Zephyr Associates, Inc." /v StyleDir') do set "StyleDir=%%~b"
@for /f "tokens=2*" %%a in ('REG Query "HKLM\SOFTWARE\Zephyr Associates, Inc." /v StyleDir') do set "StyleDir=%%~b"
@for /f "tokens=2*" %%a in ('REG Query "HKLM\SOFTWARE\Wow6432Node\Zephyr Associates, Inc." /v StyleDir') do set "StyleDir=%%~b"
基本上它要求注册表中的ini文件,然后我尝试了一些不同的东西来实际修改“%StyleDir%\ Style.ini”
非常感谢任何帮助
修改
所以,我已经有一段时间了,因为我已经能够回到这个项目了。所以每个人都拥有它,ini文件的前几行是:
[Default]
DataHome=C:\ProgramData\Zephyr\Data
SQLiteHome=c:\programdata\zephyr\data
[DataBaseList]
DbsId=Mng,Fnd,Set,Stl,Isa,Zac,Djg,Msc,Sbf,Zml,Sbi,Sge,Sgs,Ssb,Sus,Srz,Zhp,Zsq,Zsm,Zrg,Zin,Ecn,Ind,Man
CustDbSId=Man
[ZephyrApps]
SAName=Style.exe
AAName=Alloc.exe
SAVersion=8.4.0
我正在寻找的结果是:
[Default]
DataHome=C:\ProgramData\Zephyr\Data
SQLiteHome=c:\programdata\zephyr\data
[DataBaseList]
DbsId=Mng,Fnd,Set,Stl,Isa,Zac,Zin,Ind,Ecn,Man
CustDbSId=Man
[ZephyrApps]
SAName=Style.exe
AAName=Alloc.exe
SAVersion=8.4.0
或者,一种方法可能是重写DbsID =与Mng,Fnd,Set,Stl,Isa,Zac,Zin,Ind,Ecn +在CustDbsID =
中的任何内容到目前为止,我所做的粗略事情是:
@echo off
for /f "tokens=2*" %%a in ('REG Query "HKCU\SOFTWARE\Zephyr Associates, Inc." /v StyleDir 2^>nul' ) do set "StyleDir=%%~b"
for /f "tokens=2*" %%a in ('REG Query "HKLM\SOFTWARE\Zephyr Associates, Inc." /v StyleDir 2^>nul') do set "StyleDir=%%~b"
for /f "tokens=2*" %%a in ('REG Query "HKLM\SOFTWARE\Wow6432Node\Zephyr Associates, Inc." /v StyleDir 2^>nul') do set "StyleDir=%%~b" 2^>nul
CD %StyleDir%
for /f "tokens=2 delims==" %%a in ('findstr DbsId style.ini') do set DbsId=%%a
echo=%DbsId%
pause
set string=%DbsId%
set string=%DbsId:Djg,= %
set string=%DbsId%
set string=%DbsId:Sbf,= %
set string=%DbsId%
set string=%DbsId:Zml,= %
set string=%DbsId%
set string=%DbsId:Sbi,= %
set string=%DbsId%
set string=%DbsId:Sge,= %
set string=%DbsId%
set string=%DbsId:Sgs,= %
set string=%DbsId%
set string=%DbsId:Ssb,= %
set string=%DbsId%
set string=%DbsId:Sus,= %
set string=%DbsId%
set string=%DbsId:Srz,= %
set string=%DbsId%
set string=%DbsId:Zhp,= %
set string=%DbsId%
set string=%DbsId:Zsq,= %
set string=%DbsId%
set string=%DbsId:Zsm,= %
set string=%DbsId%
set string=%DbsId:Zrg,= %
pause
暂停到位只是为了看我是否正在做我应该做的事情。这当然是在备份和替换文件之前。
说实话,我对我收到的一些答案没有最好的理解,所以我希望这能澄清我想要做的事情。我很抱歉以前没有提供大量的信息。
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
SET "styledir=c:\106x"
SET "inifile=q27973295.txt"
(
FOR /f "usebackq delims=" %%a IN ("%styledir%\%inifile%") DO (
FOR /f "tokens=1*delims==" %%b IN ("%%a") DO (
IF /i "%%b"=="dbside" (
SET "line=%%c"
FOR %%d IN (Djg,Msc,Sbf,Zml,Sbi,Sge,Sgs,Ssb,Sus,Srz,Zhp,Zsq,Zsm,Zrg) DO SET "line=!line:%%d=!"
ECHO(dbside=!line!
) ELSE (
ECHO(%%a
)
)
)
)>"%tempfile%a"
TYPE "%tempfile%a"
REM move "%tempfile%a" "%styledir%\%inifile%"
GOTO :EOF
您已经获得了' styledir - I used a convenient directory and recorded this dummy data (a smaple would have been good...) in a file named
的价值q27973295.txt`
junk junk
whatever and so on
dbside=waffle waffle Djg leave Msc hello Sbf 2 Zml 3 Sbi 4 Sge 5 Sgs 6 Ssb 7 Sus 8 Srz 9 Zhp 10 Zsq 11 Zsm 12 Zrg
continue blah blah blah
生成的tempfile中的结果是:
junk junk
whatever and so on
dbside=waffle waffle leave hello 2 3 4 5 6 7 8 9 10 11 12
continue blah blah blah
无论你是move /y
原始文件还是copy /y
,然后删除临时文件,我都会自行决定。当然,先测试。
请注意,@echo off
会关闭echo
,因此无需在每行前加@
。
另请注意,删除目标行中的字符不区分大小写。
答案 1 :(得分:0)
我会告诉您确定INI文件的位置。
使用纯本机批处理执行区分大小写的搜索和替换是非常困难的(并且很慢) - 不值得付出努力。
我会使用我的JREPL.BAT utility - 一个混合JScript /批处理实用程序,它执行正则表达式搜索并替换文本。 JREPL.BAT是纯脚本,可以在任何Windows机器上从XP开始本地运行。
通过“dbside = line”我假设你的意思是以dbside=
开头的行。我假设名称前后可能有空格,这样dbside = some value
也会计算。
call jrepl "Djg|Msc|Sbf|Zml|Sbi|Sge|Sgs|Ssb|Sus|Srz|Zhp|Zsq|Zsm|Zrg" "" /jbegln "skip=($txt.search(/^\w*dbside\w*=/)!=0)" /f "%StyleDir%\Style.ini" /o -
第一个搜索和替换参数是直截了当的。如果该行不是“dbside =”行,则/ JBEGLN选项指示该实用程序跳过搜索/替换。 / F选项指定源文件,带有-
值的/ O选项指示JREPL用结果覆盖原始文件。
如果所有搜索都不区分大小写,则以下变体有效:
call jrepl "Djg|Msc|Sbf|Zml|Sbi|Sge|Sgs|Ssb|Sus|Srz|Zhp|Zsq|Zsm|Zrg" "" /jbegln "skip=($txt.search(/^\w*dbside\w*=/i)!=0)" /i /f "%StyleDir%\Style.ini" /o -
JREPL.BAT中嵌入了完整的文档。使用JREPL /?