サーバーに継続的にpingを実行し、応答するたびにメッセージボックスが表示されるようにします。つまり、サーバーが現在ダウンしています。バッチファイルでやりたい。
ここで述べたようにメッセージボックスを表示できます Windowsバッチファイルからポップアップ/メッセージボックスを表示
継続的にpingを実行できます
ping <servername> -t
しかし、応答したかどうかを確認するにはどうすればよいですか?
以下 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
問題は、このスクリプトが行う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ネットワークでは機能しません。
私はこれが古いスレッドであることを知っていますが、マシンがシステム上で稼働しているかどうかをテストしたいと思いました。ほぼすべてのWINマシンで「キス」したかったので、スクリプトではなくバッチファイルを使用しています。したがって、私が使用したアプローチは、複数のpingを実行し、次のように「Lost = 0」についてテストすることでした
ping -n 2 %pingAddr% | find /I "Lost = 0"
if %errorlevel% == 0 goto OK
私はこれを厳密にテストしたことはありませんが、これまでのところ私にとってはうまくいきます
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に感謝します。これが他の誰かに役立つことを願っています。
ここに私が見つけたものがあります:
: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秒待機しますが、ネットワークに接続されている場合にのみ機能します
シンプルバージョン:
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
)
)
)
これが誰かの助けになることを願っています。このロジックを使用して、個々のパスをチェックする前に、ネットワーク共有が応答するかどうかを確認します。 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
「-t」なしでpingを実行し、pingの終了コードを確認できます。応答がない場合、失敗を報告します。