web-dev-qa-db-ja.com

バッチERRORLEVEL ping応答

バッチファイルを使用して、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を実行しているので、接続不良の変数を排除できます。前に言ったように、バッチは常に失敗します。奇妙なことに、コードをコマンドプロンプトにコピーすると、プログラムは正常に動作します。プログラムがコマンドプロンプトで正常に動作するが、バッチとして動作しない理由を誰かが知っていますか?ありがとう

10
LastStar007

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トリックは、単にコマンドの出力を環境変数の値として設定するために役立ちます。

2
Jon

より信頼性の高い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 ms314msなどの文字列がpingによって出力されるかどうかをチェックすることで機能します。

(Windowsの翻訳バージョンは42 ms(スペース付き)を印刷する可能性があるため、それを確認します。)

理由:

time=TTLのマッチングなど、他の提案はそれほど信頼できません。IPv6アドレスへのpingはTTL(少なくとも私のWindows 7マシンでは)と翻訳されたバージョンを表示しないためですWindowsの場合、文字列time=の翻訳バージョンが表示されることがあります。また、time=は翻訳されるだけでなく、time<の場合のようにtime=ではなくtime<1msになる場合もあります。

22
Jelle Geerts

このシナリオでは、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そのネットワークの場所。

4
RolfBly

あなたがするなら

echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"

%が取り除かれていることがわかります。 %はバッチファイル内で特別な意味を持っているため、エスケープする必要があります。

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

ただし、成功の目安としてTTLを使用する方が簡単です。

.. | find "TTL"
4
Alex K.

私が考えることができるこれに対する最も簡単な解決策:

set error=failure
ping racer -n 1 -w 100>nul 2>&1 && set error=success

もちろん、低速リンクの場合は-wを調整する必要があります(100msはダイヤルアップより短すぎるかもしれません;-))

よろしく

1
Martin Binder

はい、pingは正しいエラーレベルを返しません。ネットワーク接続とコンピューターを確認するには、「net view computername」を使用してから%errorlevel%を確認しました-シンプルで簡単です

1
Brian

変数を使用しない別のバリエーション

ping racer -n 1 -w 100>nul || goto :pingerror
...

:pingerror
echo Host down
goto eof

:eof
exit /b
1
Toni Lazazzera
ping 198.168.57.98 && echo Success || echo failed
1
Chandan

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
0
Rod
set ErrorLevel=1
(ping example.com -n 1 && set ErrorLevel=0)>nul

ErrorLevel0 example.comがオンラインの場合、1 さもないと。

注:Win8でのみテストされています!

0
Fabio Iotti

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

ご覧のとおり、このようなスクリプトのやりすぎは必要ありません。

0
Mr. Pink

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
0
Andrew S

問題があるため、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
0
NickS

まず第一に

>@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

これがお役に立てば幸いです。

0
Justin Duijn