第一個錯誤是在一行:
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