繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM