从INI的特定行删除特定字符,并保存更改

时间:2015-01-15 21:27:59

标签: string batch-file ini

我正在尝试通过删除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

暂停到位只是为了看我是否正在做我应该做的事情。这当然是在备份和替换文件之前。

说实话,我对我收到的一些答案没有最好的理解,所以我希望这能澄清我想要做的事情。我很抱歉以前没有提供大量的信息。

2 个答案:

答案 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 /?

访问帮助