批处理文件IF与ECHO给出不同的结果

时间:2014-03-16 16:13:36

标签: windows batch-file

我发生了这个奇怪的问题 我正在使用wget下载一个文件,然后将var设置为第一行文件,然后与string进行比较以验证该文件。奇怪的是var设置为预期,echo工作fien但是当我使用if进行比较时,var会爆炸。请看下面的例子:

set /p first_line=< c:\data.dsv
echo %first_line%
if %first_line% == SomefirstLine GOTO Success

当批处理运行时,echo给出正确的var值,但是如果它给出前3行,为什么会发生这种奇怪的事情呢?

2 个答案:

答案 0 :(得分:1)

原因可能是下载文件中的行终止。如果行以0x0A(换行)结束而没有0x0D(回车),则set /p将读取,直到检索到第一个0x0D,文件结尾或最大长度。

echo命令将输出直到第一个0x0A,但变量内容是三个&#34;行&#34;,并且可以使用set first_line验证它以查看真实内容变量

您可以使用

set "first_line="
for /f "delims=" %%a in (c:\data.dsv) do set "first_line=%%a" & goto done
:done

或者,如果您更喜欢使用set /p方法读取文件,则对检索到的变量执行相同的处理以提取所需的值

set /p first_line=< c:\data.dsv
set "first_first_line="
for /f "delims=" %%a in ("%first_line%"
) do if not defined first_first_line set "first_fisrt_line=%%a"

已编辑 - 操作系统版本似乎影响其工作方式。

第二个提议的代码在使用XP的机器上进行了测试,但是在Windows 7中它不起作用。一旦测试,for命令,而不是在0x0A字符上拆分字符串,删除0x0A,并将三行连接到分配给变量的一行。因此,只有第一个选项(只有for循环)适用于两个版本。

选项3 - 为了避免将完整文件读入内存,可以解析set命令的输出以检索真实的第一行。

@echo off

:: get data
    set /p "first_line="<c:\data.dsv

:: show data
    echo(data retrieved with set /p
    echo(----------------------------------------------------
    echo(%first_line%
    echo(----------------------------------------------------
    set first_line
    echo(----------------------------------------------------
    echo(

:: get data 2
    for /f "tokens=1,* delims==" %%a in ('set first_line^|find "first_line="') do set "first_line=%%b"

:: show data
    echo(data retrieved with for
    echo(----------------------------------------------------
    echo(%first_line%
    echo(----------------------------------------------------
    set first_line
    echo(----------------------------------------------------

:: test data    
    set "SomeFirstLine=...."
    if "%first_line%"=="SomeFirstLine" GOTO Success

答案 1 :(得分:1)

请注意if比较中的double quotes - 它们会保护spaces&个字符。

set /p first_line=< c:\data.dsv
echo %first_line%
if "%first_line%" == "SomefirstLine" GOTO Success
相关问题