2015/02/06

PowerShell ローカル ネットワーク全体にPingを送信したい

PowerShell を使ってネットワーク全体にPingを送信、応答結果が欲しい場合のスクリプトを書いてみました。
フリーソフトのような高速にPing送信/応答は出来ませんが、その場で簡易に確認したい時に使えます。

Ping送信

PowerShell を使ってPing コマンドを実行すると、戻り値の型は配列になります。
※戻り値の型を調べたい場合は、GetType()を実行します。
$r = ping "192.168.1.254" -4 -w 1 -n 1
for($i=0; $i -lt 7; $i++){
    write-host "$i -> "$r[$i]
}
このスクリプトを実行した結果は下記の通りとなります。
結果:応答がある場合
0 ->  
1 ->  192.168.1.254 に ping を送信しています 32 バイトのデータ:
2 ->  192.168.1.254 からの応答: バイト数 =32 時間 =14ms TTL=128
3 ->  
4 ->  192.168.1.254 の ping 統計:
5 ->      パケット数: 送信 = 1、受信 = 1、損失 = 0 (0% の損失)、

6 ->  ラウンド トリップの概算時間 (ミリ秒):
7 ->      最小 = 1ms、最大 = 1ms、平均 = 1ms
結果:タイムアウトする場合
0 ->  
1 ->  192.168.1.250 に ping を送信しています 32 バイトのデータ:
2 ->  要求がタイムアウトしました。
3 ->  
4 ->  192.168.1.250 の ping 統計:
5 ->      パケット数: 送信 = 1、受信 = 0、損失 = 1 (100% の損失)、
6 ->
7 ->

ネットワークを全スキャンする

上のスクリプトを改良し、ネットワークの任意の範囲に対しPingを送信します。
応答の有り無しは、配列3番目の文字列に「応答」があるかどうかで判定しています。
$ao = 192 #第1オクテット
$bo = 168 #第2オクテット
$co = 1   #第3オクテット
$s = 1    #第4オクテット開始
$e = 254  #第4オクテット終了
#Ping送信
Write-Host "Pingを送信します(対象:$ao.$bo.$co.$s - $ao.$bo.$co.$e)" -ForegroundColor Cyan
for($do=$s; $do -le $e; $do++){
    $a = "$ao.$bo.$co.$do"
    $r = ping $a -4 -w 1 -n 1
    if($r[2].IndexOf("応答") -ge 0){
        Write-Host "  $a から応答がありました"
    }
}
#終了
Write-Host "終了しました" -ForegroundColor Cyan
スポンサーリンク

スポンサーリンク