バッチファイルを使用して、pingを使用したネットワーク接続を確認しようとしています。 pingが成功したかどうかをバッチ実行してから印刷したいと思います。問題は、バッチとして実行すると常に「失敗」が表示されることです。これがコードです:
@echo off
cls
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
「レーサー」は私のコンピューターの名前です。自分のコンピューターにpingを実行しているので、接続不良の変数を排除できます。前に言ったように、バッチは常に失敗します。奇妙なことに、コードをコマンドプロンプトにコピーすると、プログラムは正常に動作します。プログラムがコマンドプロンプトで正常に動作するが、バッチとして動作しない理由を誰かが知っていますか?ありがとう
FIND
とエラーレベルの設定の間の相互作用が正確にはわかりませんが、これは非常に簡単に行うことができます。
@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%
これは0
pingが失敗した場合、1
成功した場合。 pingの数をカスタマイズできるように、 "0%の損失"(具体的には4 pingではない)を探すようにしました。
パーセント記号が2倍になっているため、置換する必要のある変数と間違えられません。
FOR
トリックは、単にコマンドの出力を環境変数の値として設定するために役立ちます。
より信頼性の高いping
エラーチェック方法:
@echo off
set "Host=192.168.1.1"
ping -n 1 "%Host%" | findstr /r /c:"[0-9] *ms"
if %errorlevel% == 0 (
echo Success.
) else (
echo FAILURE.
)
これは、69 ms
や314ms
などの文字列がping
によって出力されるかどうかをチェックすることで機能します。
(Windowsの翻訳バージョンは42 ms
(スペース付き)を印刷する可能性があるため、それを確認します。)
理由:
time=
やTTL
のマッチングなど、他の提案はそれほど信頼できません。IPv6アドレスへのpingはTTL
(少なくとも私のWindows 7マシンでは)と翻訳されたバージョンを表示しないためですWindowsの場合、文字列time=
の翻訳バージョンが表示されることがあります。また、time=
は翻訳されるだけでなく、time<
の場合のようにtime=
ではなくtime<1ms
になる場合もあります。
このシナリオでは、0%の損失をテストすると誤検知が発生する可能性があります。通常、some_IP-addressにネットワークドライブがあり、それがオンかどうかを確認するとします。
そのドライブがオフで、pingを送信するIPアドレスであるsome_IP-addressに対してpingを実行すると、次のように応答します。Answer from your_own_IP-address: target Host not reachable
... 0% loss
あなたはif exist
またはif not exist
そのネットワークの場所。
あなたがするなら
echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
%
が取り除かれていることがわかります。 %
はバッチファイル内で特別な意味を持っているため、エスケープする必要があります。
"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss),"
ただし、成功の目安としてTTLを使用する方が簡単です。
.. | find "TTL"
私が考えることができるこれに対する最も簡単な解決策:
set error=failure
ping racer -n 1 -w 100>nul 2>&1 && set error=success
もちろん、低速リンクの場合は-wを調整する必要があります(100msはダイヤルアップより短すぎるかもしれません;-))
よろしく
はい、pingは正しいエラーレベルを返しません。ネットワーク接続とコンピューターを確認するには、「net view computername」を使用してから%errorlevel%を確認しました-シンプルで簡単です
変数を使用しない別のバリエーション
ping racer -n 1 -w 100>nul || goto :pingerror
...
:pingerror
echo Host down
goto eof
:eof
exit /b
ping 198.168.57.98 && echo Success || echo failed
Pingの結果でFINDの概念が気に入ったのですが、pingされているアドレスからの応答を検索しませんか?
次の例では、IPアドレスを変数として入力し、そのIPをPINGし、FINDコマンドを使用して、応答文字列でその変数を探します。応答文字列に正しいIP以外のものが含まれている場合、失敗が報告されます。
必要な場合は、FINDからERRORLEVELの値を読み取ることができます。それはあなたに働く信頼できる価値を与えます。
@echo off
Set /P IPAdd=Enter Address:
cls
ping %IPAdd% | find "Reply from %IPAdd%:"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
set ErrorLevel=1
(ping example.com -n 1 && set ErrorLevel=0)>nul
ErrorLevel
は0
example.comがオンラインの場合、1
さもないと。
注:Win8でのみテストされています!
pingにはエラーレベルの出力値があります。成功は0、失敗は1です。これを行うだけです。
C:\>ping 4.2.2.2
Pinging 4.2.2.2 with 32 bytes of data:
Reply from 4.2.2.2: bytes=32 time=28ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57
Reply from 4.2.2.2: bytes=32 time=30ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57
Ping statistics for 4.2.2.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 28ms, Maximum = 30ms, Average = 29ms
C:\>echo %errorlevel%
0
C:\>ping foo.bar
Ping request could not find Host foo.bar. Please check the name and try again.
C:\>echo %errorlevel%
1
ご覧のとおり、このようなスクリプトのやりすぎは必要ありません。
Alex Kのメモに基づいて、これはWindows 7で私にとってはうまくいきます:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%i in (PCS.TXT) do (
SET bHOSTUP=0
ping -n 2 %%i |find "TTL=" > NUL && SET bHOSTUP=1
IF !bHOSTUP! equ 1 (
CALL :HOSTUP %%i
) else (
CALL :HOSTDOWN %%i
)
)
GOTO EOF
:HOSTUP
echo Host UP %1
GOTO EOF
:HOSTDOWN
echo Host DOWN %1
GOTO EOF
:EOF
exit /B
問題があるため、Wi-Fi接続をリセットする必要がありました。これは私の迅速な解決策でした。
@echo off
Rem Microsoft Windows 10 ping test to gateway.
Rem Run batch file from an administrative command Prompt.
cls
:starting
Rem Send one ping to the gateway. Write the results to a file.
ping 192.168.1.1 -n 1 > pingtest.txt
Rem Search for unreachable in the file.
c:\windows\system32\findstr.exe "unreachable" pingtest.txt
Rem errorlevel 0 reset the adapter if 1 then wait 10 minutes and test again
if %errorlevel%==1 goto waiting
Rem unreachable was found reset the adapter.
Rem write the date and time the reset was done.
echo Reset date: %date% time: %time% >> resettimes.txt
Rem issue netsh interface show interface to find your adapter's name to reset
Rem my adapter is "wi-fi"
netsh interface set interface "wi-fi" disable
timeout /t 5
netsh interface set interface "wi-fi" enable
:waiting
echo "It is online waiting 10 minutes"
timeout /t 600
goto starting
まず第一に
>@echo off
>for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
>echo %MATCHES%
動作しません。失敗しない場合は、0%であるため、0%を検出します。失敗した場合、100%の損失が発生するため、機能しません。つまり、10 10の後ろに0%の損失部分が見つかりました(0%の損失)
次のように100%の損失を検出します。
>for /f %%i in ('ping -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i
エラーレベルは少しめちゃくちゃになるかもしれませんが、それは魅力のように機能します:
>if '%check%'=='1' goto fail
>if '%check%'=='0' echo %pc% is online.&goto starting
1は失敗したことを意味します0は成功したことを意味します
私のスクリプトでは、リンクを使用しています。 Goto failは、スクリプトの:failに移動します。このスクリプトは、%pc%(最初にユーザー入力があります)がオフラインであり、別の実行に進むことを通知します。
>:fail
>color 0c
>title %pc% is offline
>echo %pc% is offline
>PING -n 6 127.0.0.1>nul
>goto choice
これがお役に立てば幸いです。