【发布时间】: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