batch file,stringvariables比较,if语句

我想比较一个文件的日志与一个普通的string,但它不进入如果比较。 我在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 

第一个错误是符合的:

 SET str1 = " Connect failed" 

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

作为答案为什么在命令行上使用'set var = text'之后没有'echo%var%'的字符串输出? 详细解释,正确的语法是:

 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" 

因为环境变量str1没有在FOR命令块上面定义,所以在执行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.的原因echo. 输出一个空行请参阅Windows CMD文件中的回显紧跟在斜线后面的是什么?

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

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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

请参阅关于Windows环境变量的维基百科文章,其中列出了与USERPROFILE等描述相同的预定义环境变量。