一連のpingの平均遅延を決定するバッチを実行しているときに、異常な問題が発生しました。pingをFINDコマンドにパイプするときに、検索対象の文字列がpingで見つからない場合、FORループはDO部分を実行せず、代わりに次の反復にスキップします。
たとえば、次のコマンドを使用します。
FOR /F "tokens=*" %X in ('ping 8.8.8.8 -n 1 -w 1000^|FIND "Average"') do echo Result: %X
それをコマンドラインに投げると、期待どおりの結果が得られます。
Result: Minimum = 23ms, Maximum = 23ms, Average = 23ms
pingが失敗した場合、次のように表示されます。結果:
代わりに、結果はnullになります。そこにデッドIPを投げることでこれを試すことができます。
FOR /F "tokens=*" %X in ('ping 1.1.1.1 -n 1 -w 1000^|FIND "Average"') do echo Result: %X
コマンドがテキストファイルからIPアドレスを反復するバッチスクリプトでこれを使用すると、これは私にあらゆる種類の大混乱を引き起こします。
たとえば、{8.8.8.8,8.8.4.4,1.1.1.1}を含むip.txtがあります。バッチファイルがループで実行される場合、出力は次のようになると思います。
8.8.8.8 - 23ms
8.8.8.8 - 36ms
1.1.1.1 -
8.8.8.8 - 20ms
8.8.8.8 - 18ms
1.1.1.1 -
代わりに私は得る:
8.8.8.8 - 23ms
8.8.8.8 - 36ms
8.8.8.8 - 20ms
8.8.8.8 - 18ms
FINDが値なしで返す行は、DOフェーズを無視し、代わりにすぐに繰り返します。
FORループがDOフェーズを無視し、どのような状況でも反復を続けるのを見たことがありません。回避策や、なぜこれが起こっているのかについての説明さえも素晴らしいでしょう。
ありがとう!
編集1:ハリー・ジョンストン
早速のお返事ありがとうございます。残念ながら、私が知る限り、この問題はFORループの外では解決できません。
これは、単一のIPの例では正常に機能しますが、繰り返される複数の値では機能しません。問題は、レイアウトされているように、例ではすべての反復後に1行しか返さず、その行が最後の反復の値になることです。
これは、実行されている実際のコードにはるかに近いものです。テキストファイル名ip.txtを作成し、IPアドレスのリストを1行に1つずつ入力します。
test.bat
@echo off
cls
if not exist [logs] md [logs]
FOR /F "eol=;" %%i in (ip.txt) do for /f "tokens=9" %%p in ('ping %%i -n 3 -w 1000 ^|FIND "Average"') do echo Result - %%p
pause
ip.txt
8.8.8.8
1.1.1.1
8.8.4.4
あなたのソリューションでは、これは[8.8.4.4]のpingの結果のみをエコーします。そのままでは、1番目と3番目の結果が返され、2番目のスキップが完了します。
EDIT2:dbenham
あなたたちは素晴らしいです、これは完璧にうまくいきました!問題の説明と回答の提供に時間を割いていただき、ありがとうございます:)
FOR /F "eol=;" %%i in (ip.txt) do for /f "tokens=9" %%p in ('ping %%i -n 3 -w 1000^|find "Average"^|^|echo . . . . . . . . ERROR') do echo Result: %%p