コマンドプロンプトに貼り付けたコマンドが意図通りに実行されません。
どなたかご知見をお持ちでらっしゃる方がいらっしゃいましたら、ご教示ください。
***
Excelに列挙したIPアドレスに対して、文字列結合で以下のようなコマンドを作り、
コマンドプロンプトにコピー&ペーストで貼り付けると、
意図しない結果が返ってきてしまいます。
#コマンドは、Pingから返される標準出力に「バイト数 =32」という文字列が
含まれたら「成功」とechoし、含まれなかったら「失敗」とechoする単純な内容です。
下記は、ループバックアドレスは「成功」、「1.1.1.1」「2.2.2.2」は「失敗」となるはずが
echoされた結果が一つ目を除いてあべこべになってしまっています。
ping -n 1 127.0.0.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) ping -n 1 1.1.1.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) ping -n 1 127.0.0.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) ping -n 1 2.2.2.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) ping -n 1 127.0.0.3 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) *以下結果* C:\Users\isf00039>ping -n 1 127.0.0.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) 127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128 成功 C:\Users\isf00039>ping -n 1 1.1.1.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) 成功 C:\Users\isf00039>ping -n 1 127.0.0.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) 127.0.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128 失敗 C:\Users\isf00039>ping -n 1 2.2.2.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) 成功 C:\Users\isf00039>ping -n 1 127.0.0.3 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗) 127.0.0.3 からの応答: バイト数 =32 時間 <1ms TTL=128 失敗
何故このようなことが起こってしまうのでしょうか。
#「&」を使わず、ping と行とIFの行を分けると正しく表示されることから
「&」による1行記述に何かしら問題があるとにらんでいます。
#引数を外部テキストファイルに持ち、ループで実行すれば済むだけの話ではあるのですが
認識通りの挙動をしないため、正しい理解を得たく質問させていただいております。
> コマンドプロンプトにコピー&ペーストで貼り付けると、
意図しない結果が返ってきてしまいます。
一気に実行した場合の話でしょうか?自分の手元で1つずつ実行した場合は特に問題なく実行されました。
ご検証ありがとうございます。
1つずつ実行しても、おかしい結果が返ってきてしまいます。
======================================
C:\Users\user>ping -n 1 127.0.0.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗)
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
失敗
C:\Users\user>ping -n 1 1.1.1.1 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗)
成功
C:\Users\user>ping -n 1 127.0.0.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗)
127.0.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128
失敗
C:\Users\user>ping -n 1 2.2.2.2 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗)
成功
C:\Users\user>ping -n 1 127.0.0.3 | find "バイト数 =32"&IF %ERRORLEVEL% EQU 0 (echo 成功) ELSE (echo 失敗)
127.0.0.3 からの応答: バイト数 =32 時間 <1ms TTL=128
失敗
======================================
otn様よりご回答いただいた通り、%ERRORLEVEL%が行単位で解析されてしまうためであると
思われます。
maisumakun様の環境では問題無く実行されるとのことですが、
「1.1.1.1」や「2.2.2.2」が疎通するようなご環境で実行されたりは
してませんでしょうか。
> 「1.1.1.1」や「2.2.2.2」が疎通するようなご環境で実行されたりは
してませんでしょうか。
えっと、1.1.1.1は通信可能です。
https://1.1.1.1/
ご回答ありがとうございます。
私の環境では1.1.1.1へはPingが疎通しないため
環境の違いかと存じます。
==============================
C:\Users\user>ping 1.1.1.1
1.1.1.1 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
1.1.1.1 の ping 統計:
パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
==============================
回答1件
あなたの回答
tips
プレビュー