我正在开发这个批处理文件。它应该在配置文件中更改两个值,让我们说ValueA和ValueB。配置文件采用以下格式:
[Section]
ValueX=5
ValueA=6
ValueY=True
[Section2]
ValueB=9
ValueZ=4
我遍历原始文件并将更新的文件写入%temp%
。
for /F "tokens=* delims= usebackq" %%F in ("C:\config.txt") do call :doline "%%F"
goto :eof
:doline
set line=%~1
if "%line:~0,7%" equ "ValueA=" (
echo.Width=%valuea%>> %temp%\tempcfg
) else (
if "%line:~0,7%" equ "ValueB=" (
echo.Height=%valueb%>> %temp%\tempcfg
) else (
echo.%line%>> %temp%\tempcfg
)
)
这有两个缺陷,主要是在echo.%line%>> %temp%\tempcfg
行。
不打印空行。
以=0
结尾的行将打印到标准输出,而不是文件。我试着换线。
echo.%line% >> %temp%\tempcfg
在每行的末尾打印一个空格。
echo.%line% 1>> %temp%\tempcfg
与上述内容相同。
echo.%line%1>> %temp%\tempcfg
在每行的末尾打印1。
您对如何解决这些问题有任何建议吗?
答案 0 :(得分:1)
问题是在解析行之前会评估%line%
内容。因此,包含数字后跟>>
的任何内容都应理解为:将输出重定向到指定的数字输出句柄,而不是默认输出。
请参阅:Using command redirection operators
要解决此问题,请改用延迟变量扩展;这样,在变量实际就地扩展之前,就会解析该行的含义。
以下适用于Windows 7命令行。
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=* delims= usebackq" %%F in ("C:\config.txt") do call :doline "%%F"
endlocal
goto :eof
:doline
set line=%~1
if "%line:~0,7%" equ "ValueA=" (
echo.Width=!line:~7!>> %temp%\tempcfg
) else (
if "%line:~0,7%" equ "ValueB=" (
echo.Height=!line:~7!>> %temp%\tempcfg
) else (
echo.!line!>> %temp%\tempcfg
)
)
关于空行的 编辑,显然,FOR
命令的预期行为是吞噬这些行。有关可能的解决方案,请参阅DOS batch FOR loop with FIND.exe is stripping out blank lines?。
答案 1 :(得分:1)
为什么空行没有发送到输出?因为它们不是由for
命令处理的。通过dessign,跳过空行。我们需要确保处理行以向其添加内容。通常的方法是使用findstr
对行进行编号然后将其删除
for /F "tokens=1,* delims=:" %%F in ('findstr /n "^" "C:\config.txt"'
) do call :doline "%%G"
for
执行findstr
对行进行编号,然后使用冒号作为分隔符分割每行,%%F
获取行号,%%G
行的其余部分
现在,在:doline
子例程中,您必须处理数字结束行的问题。这可以通过改变编写命令的方式来解决。 Fisrt指示发送数据的位置,然后回显数据
:doline
set "line=%~1"
if "%line:~0,7%" equ "ValueA=" (
>> %temp%\tempcfg echo(Width=!line:~7!
) else if "%line:~0,7%" equ "ValueB=" (
>> %temp%\tempcfg echo(Height=!line:~7!
) else (
>> %temp%\tempcfg echo(!line!
)
或者,更好的是,不要在子例程中重定向并重定向for
命令的完整输出
@echo off
setlocal
(
for /F "tokens=1,* delims=:" %%F in (
'findstr /n "^" "C:\config.txt"'
) do call :doline "%%G"
) > %temp%\tempcfg
endlocal
goto :EOF
:doline
set "line=%~1"
if "%line:~0,7%" equ "ValueA=" (
echo(Width=!line:~7!
) else if "%line:~0,7%" equ "ValueB=" (
echo(Height=!line:~7!
) else (
echo(!line!
)