第一个错误是在一行:
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"
选项/开关与/
和\
被用作目录分隔符指定的Windows。因此,不区分大小写的比较开关必须是/i
而不是\i
。
在命令提示符窗口运行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.
输出的原因一个空行看到What does an echo followed immediately by a slash do in a Windows CMD file?
的012用法或任何其他大写字母而不是n
作为循环变量更安全。为什么?在命令命令窗口for /?
运行和读取输出也帮助解释%~nI
。在批处理文件中使用%%~n
时,Windows命令解释程序可能不清楚循环变量n
的当前值是否应与删除的周围双引号一起使用,或者由于修饰符~n
后循环变量丢失而出现语法错误。循环变量区分大小写。大写字母的使用避免了用修饰符解释循环变量的冲突。
为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?
参见维基百科的文章像USERPROFILE与描述预定义的环境变量列表约Windows Environment Variables。
制备'if'不区分大小写需要使用'/ I'开关。将'\ i'改为'/ I'。 – lit
您需要查看[延期扩展](http://ss64.com/nt/delayedexpansion.html)... – aschipfl
或将'set'命令从'for'循环移出(在'for'之前) – Stephan