我想比较一个文件的日志与一个普通的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等描述相同的预定义环境变量。