将空行和以零结尾的行打印到文件中

时间:2014-05-29 15:33:27

标签: batch-file cmd echo

我正在开发这个批处理文件。它应该在配置文件中更改两个值,让我们说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行。

  1. 不打印空行。

  2. =0结尾的行将打印到标准输出,而不是文件。我试着换线。

    • echo.%line% >> %temp%\tempcfg在每行的末尾打印一个空格。

    • echo.%line% 1>> %temp%\tempcfg与上述内容相同。

    • echo.%line%1>> %temp%\tempcfg在每行的末尾打印1。

  3. 您对如何解决这些问题有任何建议吗?

2 个答案:

答案 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!
    )