批处理文件,字符串变量比较,if语句

时间:2017-05-26 16:12:15

标签: windows batch-file if-statement cmd

我试图将文件的日志与普通字符串进行比较,但是如果进行比较则不会进入。我正在"连接失败"作为echo语句中的第二个标记,但没有得到任何IF语句的结果。

@echo off
rem start cmd.exe
for /f "tokens=2 delims=:" %%n IN (C:\Users\rohit.bagjani\Desktop\result\telnetresult.txt) DO (
    SET str1 = " Connect failed"
    echo %%n
    if \i %str1%==%%n echo "true"
)
echo.
pause

1 个答案:

答案 0 :(得分:2)

第一个错误在于:

SET str1 = " Connect failed"

此行定义一个名为str1 的环境变量,其名称末尾有一个空格,其值为 " Connect failed"。前导空格和两个双引号也作为字符串的一部分分配给变量。

正如Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案详细解释的那样,正确的语法是:

set "str1=Connect failed"

此命令行定义了一个环境变量str1,其值为Connect failed

在命令提示符窗口set /?中运行,以在多个显示页面上显示该命令的帮助。

第二个错误在于:

if \i %str1%==%%n echo "true"

选项/开关在Windows上使用/指定,\用作目录分隔符。因此,不区分大小写的比较开关必须为/i而不是\i

在命令提示符窗口if /?中运行,以获取 IF 命令的帮助。

第三个错误是尝试在命令块中定义环境变量,并为环境变量分配字符串值,并在同一命令块中不使用延迟扩展引用此环境变量的值。

每当Windows命令解释程序遇到一个开始的圆括号(被解释为命令块的开头时,它会将所有内容解析为匹配的括号),并替换用%VariableName%完成的所有环境变量引用通过环境变量的当前值。

在发布的代码中,这意味着行

if \i %str1%==%%n echo "true"
Windows命令解释程序将

更改为

if \i == %n echo "true"
完全执行 FOR 之前

因为环境变量str1未在 FOR 命令块上方定义。

通过将echo off更改为echo on或删除echo off行或使用命令rem将其注释掉并从中运行批处理文件,可以很容易地看到这一点命令提示符窗口。然后,Windows命令解释程序在执行前预处理后输出每个命令块和每个命令行。

双击批处理文件以执行它是不好的,因为窗口在批处理退出时自动关闭,因为这样的语法错误。使用pause没有帮助,因为在cmd.exe检测到语法错误时根本没有达到此命令行。

解决方案是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=2 delims=:" %%I in ("%USERPROFILE%\Desktop\result\telnetresult.txt") do (
    set "str1=Connect failed"
    echo %%I
    if /I "!str1!" == "%%~I" echo true
)
endlocal
echo/
pause

但更容易,也更有效:

@echo off
for /F "usebackq tokens=2 delims=:" %%I in ("%USERPROFILE%\Desktop\result\telnetresult.txt") do (
    echo %%I
    if /I "Connect failed" == "%%~I" echo true
)
echo/
pause

由于使用echo/而不是echo.输出空行的原因,请参阅What does an echo followed immediately by a slash do in a Windows CMD file?

使用I或任何其他大写字母而不是n作为循环变量更安全。为什么?在命令命令窗口for /?中运行并阅读输出帮助,同时解释%~nI。在批处理文件中使用%%~n时,如果循环变量n的当前值应该与周围的双引号一起使用或者语法错误作为循环变量,则可能不清楚Windows命令解释程序修饰符~n后缺少。循环变量区分大小写。大写字母的使用避免了使用修饰符解释循环变量时的冲突。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

有关{strong> USERPROFILE 等描述的预定义环境变量列表,请参阅Wikipedia关于Windows Environment Variables的文章。