2017-05-26 19 views
0

ファイルのログを単純な文字列と比較しようとしていますが、比較しても比較できません。 echoステートメントで2番目のトークンとして "Connect failed"が表示されていますが、IFステートメントの結果は得られません。バッチファイル、文字列変数の比較、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 
+3

'if 'の大文字と小文字を区別しないようにするには、'/I'スイッチを使用する必要があります。 '\ i'を'/I'に変更してください。 – lit

+0

[遅延拡張](http://ss64.com/nt/delayedexpansion.html)... – aschipfl

+0

をチェックするか、 'for'ループの' set'コマンドを 'for'の前に移動する必要があります – Stephan

答えて

1

最初のミスがラインである:

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 onecho 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の記事を参照してください。

+0

このような説明のために十分にあなたに感謝することはできません。 –