web-dev-qa-db-ja.com

Windows 7からのpingは応答を取得しませんが、errorlevelを0に設定します

Windows 7マシンから、オフになっているマシンのIPアドレスにpingを実行します。

C:\>ping 192.168.1.222
Pinging 192.168.1.222 with 32 bytes of data:
Reply from 192.168.1.222: Destination Host unreachable.
Reply from 192.168.1.222: Destination Host unreachable. 
Reply from 192.168.1.222: Destination Host unreachable.

Ping statistics for 192.168.1.222:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss)

応答がない場合でも、エラーレベルは0に設定されます。

私がしようとしているのは、リモートマシンがpingに応答しているかどうかを調べることです。私のテストの1つは、マシンの電源を切り、pingを実行することです。何らかの理由で、pingはerrorlevelを0に設定します。

10
Doron

私も問題に直面し、キー "-w 20"で解決しました。キー "-w"とミリ秒数で補足されたpingは、ローカルサブネットのホストに到達できない場合に1を返します。 AFAIK、ミリ秒数は、Windowsのネットワークサブシステムが「宛先ホストに到達できません」を返した後のタイムアウトよりも小さくする必要があります。

私のPC(Windows 7)の場合:
C:> ping -w 192.168.10.22

32バイトのデータで192.168.10.22にpingを実行します。
192.168.10.2からの返信:宛先ホストに到達できません。
192.168.10.2からの応答:宛先ホストに到達できません。
192.168.10.2からの返信:宛先ホストに到達できません。
192.168.10.2からの返信:宛先ホストに到達できません。

192.168.10.22のping統計:
パケット:送信= 4、受信= 4、紛失= 0(%損失)、

C:> echo%errorlevel%

だが

C:> ping -w 2999 192.168.10.22

32バイトのデータで192.168.10.22にpingを実行します。
リクエストはタイムアウトしました。
リクエストはタイムアウトしました。
リクエストはタイムアウトしました。
リクエストはタイムアウトしました。

192.168.10.22のping統計:
パケット:送信= 4、受信= 0、紛失= 4(100%損失)、

C:> echo%errorlevel%
1

8
user354000

これは、宛先がローカルサブネット上にあるためです。宛先がローカルサブネットの外にある場合、予想されるRequest timed out.が表示されます。ただし、ローカルサブネット内に存在しない宛先もReply from x.x.x.x: Destination Host unreachable.を報告します。 このワールプールの投稿 が説明しているように、それはすべて、タイムアウトした最初のホップであるかどうかによって異なります-ローカルサブネットへのpingはシングルホップのみです。 明らかに、これは仕様によるものですany応答を受信すると、エラーレベルが0に設定され、Host unreachableは返信としてカウントされます。


回避策

ping出力をfindstrで解析する

出典: http://forums.techguy.org/7318331-post3.html

以下は1回pingします(ping -n 1)。 %1は、バッチファイルに渡される最初のパラメータです。変数attribは、宛先が応答するかどうかに応じて設定されます。

echo Scanning %1
set attrib=responding
ping -n 1 %1|Findstr /I /C:"timed out" /C:"Host unreachable" /C:"could not find Host"
if %errorlevel%==0 set attrib=nonresponsive

別のユーティリティ

alive という興味深いユーティリティがあります。私は試していませんが、2002年にリリースされたため、Windows 7でも機能しない可能性があります。ただし、機能する場合は、宛先ホストに到達できないときにエラーレベルが2に設定されます。しかし、私はこれを本当にお勧めしません。

7
Bob

これは私にとってWindows 7で動作します:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f %%i in (PCS.TXT) do (
   SET bHOSTUP=0
   ping -n 2 %%i |find "TTL=" && SET bHOSTUP=1
   IF !bHOSTUP! equ 1 (
      CALL :HOSTUP %%i
   ) else (
      CALL :HOSTDOWN %%i 
   )
)

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B
2
Andrew S