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

标签 windows batch-file if-statement cmd

我试图用一个简单的字符串来比较一个文件的日志,但是它没有进入if比较。我在echo语句中将“connect failed”作为我的第二个令牌,但没有得到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

最佳答案

第一个错误是:

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"

选项/开关位于用/指定的窗口中,并且\用作目录分隔符。因此,用于不区分大小写比较的开关必须是/i而不是\i
在命令提示窗口if /?中运行以获取有关if命令的帮助。
第三个错误是试图在命令块中定义一个环境变量,并为该环境变量分配一个字符串值,并引用该环境变量的值,而不是在同一个命令块中使用延迟扩展。
每当windows命令解释器遇到一个开头的圆括号(被解释为命令块的开头时,它会将所有内容解析为匹配的括号),并用环境变量的当前值替换用%VariableName%完成的所有环境变量引用。
在已发布的代码中,这意味着
if \i %str1%==%%n echo "true"

被windows命令解释器更改为
if \i == %n echo "true"

因为for命令块上方未定义环境变量str1,所以完全执行fore。
通过将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时,Windows命令解释器可能不清楚循环变量n的当前值是否应在删除环绕双引号的情况下使用,或者存在语法错误,因为在修饰符~n之后缺少循环变量。循环变量区分大小写。大写字母的使用避免了使用修饰符解释循环变量时的冲突。
为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页。
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?
请参阅wikipedia关于Windows Environment Variables的文章,以获取一个预定义的环境变量列表,其中包含像userprofile这样的描述。

关于windows - 批处理文件,字符串变量比较,if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205971/

相关文章:

C++ Windows : How to close a console window?

windows - 将字符串作为参数发送到批处理脚本中时,^ 会加倍

windows - 批处理文件变量在这种特殊情况下无法打印

android - bool 逻辑语法和MYSQL语法问题

python - 字典 Python 中 If-Condition 上的 KeyError

node.js - 超慢 Node npm 命令

java - 在 Windows cmd 中使用 JAR 文件别名

c++ - 静态构建 Qt,找不到 MinGW

windows - 如何使用 Linux 实例化/运行 Ruby 程序(使用 Watir)?

c - if 语句处理两次?