[英]Batch file, string variable comparison, if statement
我正在尝试将文件的日志与纯字符串进行比较,但是如果进行比较,则不会进入。 我在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 /?
获取有关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.
的原因echo.
要输出空行,请参阅Windows CMD文件中的回声紧跟斜杠是做什么的?
使用I
或任何其他大写字母而不是n
作为循环变量更安全。 为什么? 在命令命令窗口中运行for /?
并阅读输出帮助,还解释%~nI
。 在批处理文件中使用%%~n
〜n时,对于Windows命令解释器来说可能不清楚,是否应使用循环变量n
的当前值并删除周围的双引号,否则会出现语法错误,因为修饰符后缺少循环变量~n
。 循环变量区分大小写。 大写字母的使用避免了在使用修饰符的循环变量解释中发生冲突。
为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?
有关预定义环境变量的列表,请参见有关Windows环境变量的 Wikipedia文章,其描述如USERPROFILE 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.