web-dev-qa-db-ja.com

Windowsでpingテストの応答行のみを取得する方法

通常、サーバーのIPアドレスにpingを実行すると、代わりに次のようになります。

Pinging <IP address> with 32 bytes of data:
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121

Ping statistics for <IP address>:
packets: sent = 4, Received = 4, lost = 0 (0% loss),
Approximate round trip times in milli-secounds:
Minimum = 151ms, Maximum = 151 ms, Average = 151 ms

Windowsのcmd.exeで簡単なコマンドを使用して、次の行(1つのpingテストの応答行のみ)を取得するにはどうすればよいですか(Windowsで使用されている言語に関係なく)?

Reply from <IP address> : bytes=32 time=151 TTL=121

たぶん最も簡単な方法は、2行目のみを表示することですか?これはどのように行う必要がありますか? Windowsでそれを行う方法がわからないので。

9
mastermind

これはより普遍的に機能する可能性があります。

ping -n 1 <hostname/IP> | FIND "TTL="
19
foxidrive

Findstrコマンドは、次のfor行のスキップオプションと組み合わせることができます。

C:\>ping 127.0.0.1 | for /f "skip=3 tokens=*" %a in ('findstr Reply') do @echo %a

出力は次のとおりです。

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

変化する %aから%%aバッチファイルを書き込む場合。

4
Ofir Luzon

上手、

ping -n 1 <hostname/IP>

1つのping要求のみを送信します。そして、FINDコマンドだけを使用して応答行を見つけることができるはずです。

だから、このようなもの:

ping -n 1 <hostname/IP> | FIND "Reply"

[〜#〜]更新[〜#〜]

上記は英語版のWindows 7マシンで動作することを知っています。他のローカリゼーションでも機能すると思いますが、これは誤った仮定である可能性があります。

UPDATE 2

この質問 はいくつかの洞察を提供するようです。 pingの出力をファイルに書き込む必要がある場合があります(>出力リダイレクトパイプ)し、回答のコマンドを使用して2行目のみを取得します。

3
mjgpy3

バッチ内からは非常に単純ですが、コマンドラインから...醜いことは大きな控えめな表現です:

(for /f "skip=1 delims=" %F in ('ping -n 1 localhost') do @if not defined _A @echo %F&set _A=0) &set "_A="

しかし、それはトリックを行い、2行目(含まれているものは何でも)を出力し、残りをスキップします。印刷する行を変更することができますskip=

Powershellを利用できる場合は、次のように簡単にできます:(はい、PSでpingを実行する方法ではないことを知っています):powershell "ping -n 1 localhost | select -index 2"。私の(XP)ラップトップのpingのように、各行に追加のCRを挿入すると、PSからの出力の間隔が2倍になるという効果があるので、インデックスで遊ぶ必要があるかもしれません。

2
wmz

これはpowershellで実現できます...これがスクリプトに追加できるコードです

$ping = new-object System.Net.NetworkInformation.Ping
$reply = $ping.send('127.0.0.1')
if ($reply.status -eq "Success"){
    [string]::Format("Reply from {0},time={1}",$reply.Address.ToString(),$reply.RoundtripTime)
    }else{
    $z = [system.net.dns]::gethostaddresses($hostname)[0].ipaddresstostring
    [string]::Format("FAIL,{0},{1}",$z,"***")
}

文字列は任意の形式にフォーマットできます。

1
mhatch73

@wmzの回答に基づいて、

(for /f "skip=3 tokens=*" %F in ('ping -n 1 <hostname/IP>') do @if not defined _A @echo %F&set _A=0) &set "_A="

言語に依存しないワンライナーとしては問題ありません。
また、応答がない場合(タイムアウト)に結果を提供しますが、findおよびfindstrは提供しません。

1
Mat M

何らかの理由で、Powershell 5.1 ShellでFINDパイプを機能させることができませんでした。このような感じは非常に複雑で、Reply行をgrepできるのかと思いました。次に、Powershell相当物を見つけました! 「Reply」に一致する最初の行でselect-stringを使用しただけで、探していた1行の出力が得られました。したがって、これは非常に単純かつ簡単に機能しました。

ping -n 1 <hostname/IP> | select-string -pattern 'Reply'
0
G_Style