通常、サーバーの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でそれを行う方法がわからないので。
これはより普遍的に機能する可能性があります。
ping -n 1 <hostname/IP> | FIND "TTL="
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
バッチファイルを書き込む場合。
上手、
ping -n 1 <hostname/IP>
1つのping要求のみを送信します。そして、FIND
コマンドだけを使用して応答行を見つけることができるはずです。
だから、このようなもの:
ping -n 1 <hostname/IP> | FIND "Reply"
[〜#〜]更新[〜#〜]
上記は英語版のWindows 7マシンで動作することを知っています。他のローカリゼーションでも機能すると思いますが、これは誤った仮定である可能性があります。
UPDATE 2
この質問 はいくつかの洞察を提供するようです。 pingの出力をファイルに書き込む必要がある場合があります(>
出力リダイレクトパイプ)し、回答のコマンドを使用して2行目のみを取得します。
バッチ内からは非常に単純ですが、コマンドラインから...醜いことは大きな控えめな表現です:
(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倍になるという効果があるので、インデックスで遊ぶ必要があるかもしれません。
これは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,"***")
}
文字列は任意の形式にフォーマットできます。
@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は提供しません。
何らかの理由で、Powershell 5.1 ShellでFINDパイプを機能させることができませんでした。このような感じは非常に複雑で、Reply行をgrepできるのかと思いました。次に、Powershell相当物を見つけました! 「Reply」に一致する最初の行でselect-stringを使用しただけで、探していた1行の出力が得られました。したがって、これは非常に単純かつ簡単に機能しました。
ping -n 1 <hostname/IP> | select-string -pattern 'Reply'