web-dev-qa-db-ja.com

pingが応答したかどうかをバッチファイルで確認する方法

サーバーに継続的にpingを実行し、応答するたびにメッセージボックスが表示されるようにします。つまり、サーバーが現在ダウンしています。バッチファイルでやりたい。

ここで述べたようにメッセージボックスを表示できます Windowsバッチファイルからポップアップ/メッセージボックスを表示

継続的にpingを実行できます

ping <servername> -t

しかし、応答したかどうかを確認するにはどうすればよいですか?

39
IsmailS

以下 checklink.cmdプログラムは開始するのに適した場所です。これは、シングルショットpingを実行でき、成功すると出力に次の行が含まれることに依存しています。

Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),

トークン5と7を抽出し、それぞれ"Received"および"1,"、成功を検出できます。

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%b"=="xunreachable." goto :endloop
    if "x%%a"=="xReceived" if "x%%c"=="x1,"  set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal

テストする名前(またはIPアドレス)で呼び出します:

checklink 127.0.0.1
checklink localhost
checklink nosuchaddress

ロケールが英語でない場合は、Receivedをロケールの対応するキーワード、たとえばスペイン語のrecibidosに置き換える必要があることを考慮してください。テストpingを実行して、ロケールで使用されているキーワードを見つけます。


状態changesの場合にのみ通知するには、次を使用できます。

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
    echo.Link is !state!
    set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal

ただし、Gabeがコメントで指摘しているように、ERRORLEVELを使用するだけでよいため、上記の2番目のスクリプトに相当するものは次のようになります。

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
    echo.Link is !state!
    set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
19
paxdiablo

問題は、このスクリプトが行うpingが応答したかどうかを確認することでした。

ただし、これはERRORLEVEL 0を返し、このスクリプトで使用されるReceived = 1のチェックに合格し、スクリプトからLink is UPを返すため、Host Unreachableメッセージを受け取った場合は機能しません。ホスト到達不能は、pingがターゲットNotworkに配信されたが、リモートホストが見つからない場合に発生します。

Pingが成功したかどうかを確認する正しい方法を思い出すと、検索を使用して文字列「TTL」を検索することです。

@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%

これは、pingがIPv6アドレスから応答を受信するときにTTLをリストしないため、IPv6ネットワークでは機能しません。

28
Lukasz

私はこれが古いスレッドであることを知っていますが、マシンがシステム上で稼働しているかどうかをテストしたいと思いました。ほぼすべてのWINマシンで「キス」したかったので、スクリプトではなくバッチファイルを使用しています。したがって、私が使用したアプローチは、複数のpingを実行し、次のように「Lost = 0」についてテストすることでした

ping -n 2 %pingAddr% | find /I "Lost = 0"  
if %errorlevel% == 0 goto OK

私はこれを厳密にテストしたことはありませんが、これまでのところ私にとってはうまくいきます

7
Bigrog

Paxdiabloの投稿に基づいてバリアントソリューションを作成しました

Waitlink.cmdに次のコードを配置します

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
echo.Link is !state!
if "!state!"=="up" (
  goto :endloop
)
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
:endloop
endlocal

たとえば、次のような別のバッチファイルから使用します

call Waitlink someurl.com
Net Use o: \\someurl.com\myshare

Waitlinkの呼び出しは、pingが成功した場合にのみ戻ります。 paxdiabloとGabeに感謝します。これが他の誰かに役立つことを願っています。

1
Jan Lauridsen

ここに私が見つけたものがあります:

:pingtheserver
ping %input% | find "Reply" > nul
if not errorlevel 1 (
    echo server is online, up and running.
) else (
    echo Host has been taken down wait 3 seconds to refresh
    ping 1.1.1.1 -n 1 -w 3000 >NUL
    goto :pingtheserver
) 

ご了承ください ping 1.1.1.1 -n -w 1000 >NULは1秒待機しますが、ネットワークに接続されている場合にのみ機能します

0
Juggler

シンプルバージョン:

for /F "delims==, tokens=4" %a IN ('ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
echo FAIL
)

)

しかし、最初のpingが失敗するだけで、2番目のpingが機能する(またはその逆)場合がありますか?したがって、少なくとも1つのICMP応答が正常に返されたときに成功を取得します。

for /F "delims==, tokens=4" %a IN ('ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
if %a EQU 1 (
echo Success
) ELSE (
echo FAIL
)
)

)
0
damian1baran

これが誰かの助けになることを願っています。このロジックを使用して、個々のパスをチェックする前に、ネットワーク共有が応答するかどうかを確認します。 DNS名とIPアドレスを処理する必要があります

テキストファイルの有効なパスは、\ 192.168.1.2\'folder'または\ NAS\'folder'です。

@echo off
title Network Folder Check

pushd "%~dp0"
:00
cls

for /f "delims=\\" %%A in (Files-to-Check.txt) do set Server=%%A
    setlocal EnableDelayedExpansion
        ping -n 1 %Server% | findstr TTL= >nul 
            if %errorlevel%==1 ( 
                ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul
                    if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF)
            )
:EOF
0
Dan W

「-t」なしでpingを実行し、pingの終了コードを確認できます。応答がない場合、失敗を報告します。

0
Rotsor