最初のミスがラインである:
SET str1 = " Connect failed"
この行は、それに割り当てられた値 " Connect failed"
と名前の末尾にスペースが名前str1
と環境変数を定義します。先頭のスペースと2つの二重引用符も、文字列の一部として変数に割り当てられます。
Why is no string output with 'echo %var%' after using 'set var = text' on command line?の答えは詳細に説明するように、右の構文は次のようになります。
set "str1=Connect failed"
このコマンドラインは、それに割り当てられた値Connect failed
と環境変数str1
を定義します。
コマンドプロンプトウィンドウset /?
で実行すると、いくつかの表示ページでこのコマンドのヘルプが表示されます。
第ミスがラインである:
if \i %str1%==%%n echo "true"
オプション/スイッチは、/
と\
で指定されたWindowsであるが、ディレクトリの区切りとして使用されます。したがって、大文字と小文字を区別しない比較のスイッチは、/i
で、\i
ではありません。
IFコマンドのヘルプについては、コマンドプロンプトウィンドウで実行してください。
第三のミスは、環境変数の文字列値を割り当てると、コマンドブロック内の環境変数を定義しようとする試みであり、同一のコマンドブロック内の遅延拡張を使用しないこの環境変数の値を参照します。
Windowsコマンド・インタプリタは、コマンドブロックの開始として解釈されている開口部丸括弧(
に遭遇するたびに、それがカッコ)
に一致するすべてのものを解析し、環境変数の現在の値によって%VariableName%
で行われ、すべての環境変数の参照を置き換えます。
投稿コードで
これはライン
if \i %str1%==%%n echo "true"
が FOR 前
if \i == %n echo "true"
にWindowsのコマンド・インタプリタによって変更されることがあるため、環境変数str1
のすべてで実行された上で定義されていません。 の場合のコマンドブロック。
これは簡単にecho on
にecho off
を変更することにより、見たりecho off
の行を削除するか、コマンドrem
でそれをコメントアウトして、コマンドプロンプトウィンドウ内からバッチファイルを実行することができます。その後、Windowsコマンドインタプリタは、実行前に前処理後に各コマンドブロックと各コマンドラインを出力します。
バッチファイルをダブルクリックして実行すると、このような構文エラーがあるため、バッチ処理の終了時にウィンドウが自動的に閉じられるため、実行しにくいです。 cmd.exe
で構文エラーを検出した場合、このコマンドラインにはまったく到達していないので、pause
の使用は役に立たない。
ソリューションは、次のようになります。
@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
を使用すると、ループ変数n
の現在の値を取り除いて周囲の二重引用符を削除するか、修飾子~n
の後にループ変数がないために構文エラーが発生する場合、Windowsコマンドインタープリタで不明瞭になる可能性があります。ループ変数は大文字と小文字を区別します。大文字の使用は、ループ変数の修飾子による解釈における競合を回避する。
使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?
については、USERPROFILEのような説明付きの定義済み環境変数の一覧については、Wikipediaの記事を参照してください。
'if 'の大文字と小文字を区別しないようにするには、'/I'スイッチを使用する必要があります。 '\ i'を'/I'に変更してください。 – lit
[遅延拡張](http://ss64.com/nt/delayedexpansion.html)... – aschipfl
をチェックするか、 'for'ループの' set'コマンドを 'for'の前に移動する必要があります – Stephan