【问题标题】:batch cmd parsing and rewriting an ini file批处理cmd解析和重写ini文件
【发布时间】:2014-05-30 18:15:45
【问题描述】:

我正在尝试对现有的 ini 文件进行更改,然后将这些更改重写为新的 ini 文件。我遇到的问题是解析这些部分似乎不起作用。如果我使用以下代码:

set reso=%2
set RESLINE=RESMAX=0.72
set nRESLINE=RESMAX=%reso%

setlocal enableDelayedExpansion
(
for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
    set "lines=%%a"
    if defined lines set "lines=!lines:%p4p%=%new%!"
    if defined lines set "lines=!lines:%RESLINE%=%nRESLINE%!"
    echo(!lines!
)
) > new.ini

我得到一个 new.ini 文件,当在行中找到 %p4p% 变量时,它会用 %new% 替换它,这很好。 但是当 RESLINE 命中我的输出时显示:

0.72=RESMAX=0.70=0.72

代替:

RESMAX=0.70

根据需要。我怀疑这是因为字符串中存在“=”,但我不确定如何绕过它。

我尝试做的是以下内容:

setlocal enableDelayedExpansion
(
for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
    set "lines=%%a"
    if defined lines set "lines=!lines:%p4p%=%new%!"

    for /f "tokens=1,2 delims==" %%y in ('%lines%') do (
    if %%y==RESMAX (
        set "oRES=%%z"
        set "lines=!lines:%oRES%=%reso%!"
    )
    )
    echo(!lines!
)
) > test.ini

但在这种情况下,嵌套的 for 似乎从未读入正确的信息。 我假设我在这里尝试的是解析应该是 PARAM=VALUE 格式的读取行,然后检查 PARAM 是否=单词 RESMAX,如果是,将其相应的值分配给 var oRES 然后设置读入行现在说 RESMAX=newvalue。我尝试将 %lines% 替换为 !lines!但这只是给我带来了一系列错误,说各种 ini 参数不作为可接受的程序/批次存在。 任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你是对的 - 用批处理替换 = 并不容易 - 检查这个 dostips.com/forum/viewtopic.php?f=3&t=1485&start=30
  • 如果 INI 文件中的行恰好是 RESMAX=nnnn,其中 nnnn 将被更改,则可以采用不同的方式。如果行不精确,甚至可以这样做,但我们需要知道行的真正格式,或者对整个 INI 文件进行的确切转换。给猫剥皮的方法通常不止一种。
  • RESMAX 行格式为 RESMAX=n.nnn ;但是,只有第一个数字是强制性的,其余的可能存在也可能不存在。起始 nnnn 并不总是相同的数字,它可能因系统而异。整个 INI 文件主要是逐行复制,只有两三个实例在批处理运行时根据用户输入进行更改。这是唯一一个我无法解决的例子。其他都属于我正在更改文件名的路径或在行尾定义了我可以剥离的字符数的类别。

标签: parsing batch-file cmd ini


【解决方案1】:
set "reso=%2"
set "old_reso=0.72"
set "RESLINE=RESMAX=0.72"
set "nRESLINE=RESMAX=%reso%"

setlocal enableDelayedExpansion
(
    for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
        set "lines=%%a"
        if defined lines set "lines=!lines:%p4p%=%new%!"
        if defined lines ( 
          rem set "lines=!lines:%RESLINE%=%nRESLINE%!"
          echo !lines! | find /i "%RESLINE%" >nul 2>&1 && (
            set "lines=!lines:%old_reso%=%reso%!"
          )
         )
        (echo(!lines!)
    )

) > new.ini

试试这个。或者查看dbenham的REPLVAR(问题是不能直接替换=这个符号)

【讨论】:

  • 这似乎奏效了。我必须测试它的各种值。 find 语句实际上在做什么?我所做的是将 old_reso 设置为 %RESLINE:~7% 以去除“RESMAX =”并留下任何剩余部分。这会给我带来什么问题吗?谢谢。
  • 如果一切正常,您可以接受答案:-)。如果管道输入中出现某些字符串,则查找命令 chek - ss64.com 中的 chekck 以获取更多信息。您的新方法应该不会引起问题,因为条纹 old_res 不包含 , : ~ 或等号
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 2014-07-12
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多