【问题标题】:Delete specific characters from a specific line of an INI, and save changes从 INI 的特定行中删除特定字符,并保存更改
【发布时间】:2015-03-14 10:16:52
【问题描述】:

我正在尝试创建一个批处理文件,该批处理文件将通过删除 INI 文件的特定行(在本例中为 dbside= 行)中的特定 3 个字符串来编辑 ini 文件。基本上如果以下任何字符串: Djg,Msc,Sbf,Zml,Sbi,Sge,Sgs,Ssb,Sus,Srz,Zhp,Zsq,Zsm,Zrg 在 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

或者,一种方法可能是使用 Mng,Fnd,Set,Stl,Isa,Zac,Zin,Ind,Ecn + CustDbsID= 中的任何内容重写 DbsID=

到目前为止,我得到的粗略是:

    @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

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

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

【问题讨论】:

    标签: string batch-file ini


    【解决方案1】:
    @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 namedq27973295.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
    

    生成的临时文件中的结果是:

    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 offecho 关闭,因此无需在每行前面加上 @

    还要注意,删除目标行中的字符是不区分大小写的。

    【讨论】:

    • 我不确定你的最后一句话是否足够清楚。读者可能认为您在谈论删除临时文件,而实际上您指的是批量搜索和替换不区分大小写的事实。这可能是 OP 的问题。
    • 如果有人有任何进一步的想法,我已经添加了一些额外的注释。将不胜感激。
    【解决方案2】:

    我将由您来确定 INI 文件的位置。

    使用纯原生批处理执行区分大小写的搜索和替换非常困难(而且速度很慢) - 不值得。

    我会使用我的JREPL.BAT utility - 一个混合 JScript/批处理实用程序,它执行正则表达式搜索和文本替换。 JREPL.BAT 是纯脚本,可​​以在 XP 以后的任何 Windows 机器上本地运行。

    我认为“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 -
    

    第一个搜索和替换参数是直截了当的。 /JBEGLN 选项指示实用程序在该行不是“dbside=”行时跳过搜索/替换。 /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 /?访问帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多