適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

PowerShellっぽいpingの連続送信

コマンドプロンプトではなくPowershellを使ってpingを打つ

PowerShellを使って、連続でpingを送るワンライナーです。

システムを管理していると、よく使うping。

新たに固定IPアドレスを振る場合に対象のIPアドレスが使われてないか確認したり、ネットワーク上の機器の簡便な生存確認、ネットワーク障害時など、出番は多岐に渡ります。

昔からあるコマンドなので、コマンドプロンプトで使う人も多いですが、PowerShellでももちろん使えます。

PowerShellの方が出力をパイプで渡したり、出力を編集することが容易なのでPowerShellで使った方が私的には◎です。

そんなPowerShellを使って、ちょっとしたときに連続したIPアドレスにpingを送るときに、私がよく書くワンライナーの紹介です。

大した話ではないですが、パイプラインの使い方などがPowerShellっぽいなぁと思ったので、紹介しようと思います。

コマンド

例)192.168.1.1~192.168.1.10へpingを送る 多くの企業で使われているであろうクラスCを想定。

 
1..10|%{ping "192.168.1.$_"}

これだけです。PowerShellでは、「..」が連続した数字を表します。

1..10と書いて実行すると、こんな感じ表示されます。

PS C:\> 1..10
1
2
3
4
5
6
7
8
9
10

この機能は、ループの回数が決まっているループ処理をする際にも重宝します。

特にこの機能は、for文の代りに使うことができます。例えばこのように。

PS C:\> 1..10|%{"script"}
script
script
script
script
script
script
script
script
script
script

ここでは「script」という文字列を書いているだけですが、ここに(本当にちゃんとした)スクリプトを書けば、そのスクリプトを10回処理することができます。

これを利用して、1..10をパイプラインで渡してあげます。

そして、パイプラインに渡された数値を、ForEach-Objectのエイリアスである、%で受け取り、ひとつずつ処理します。

スクリプトブロックの中は、pingで処理します。

pingの引数にある、$_変数はパイプラインから渡されたオブジェクトです。

この場合はパイプラインから数字が渡されるので、展開可能なダブルクォーテーションを使って、ネットワークアドレスと一緒に囲んであげます。

そうすることで、192.168.1.1~192.168.1.50までの連続したIPアドレスを生成することができます。

pingコマンドを取って実行してみるとこのようにIPアドレスが生成されていることが確認できます。

PS C:\>1..10|ForEach-Object{"192.168.1.$_"}
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10

ちなみにPowerShellには、pingよりも高性能なTest-Connectionコマンドもありますが、多くの場合、pingを使えば済むケースが多い気がします。

Test-Connectionは速度的に遅いみたいですし・・・。

そこまで高性能である必要もなく、pingで十分だけの場合も多々あります。

1..10の部分や、ネットワークアドレスの部分(ここでは192.168.1)を変更すれば、柔軟に対応することができるかと思います。

おわりに

PowerShellっぽいpingの連続送信について紹介しました。

地味な例ではありますが、PowerShellの文法の例としても面白いと思ったので取り上げてみました。

ここまでお読みいただき、ありがとうございました。

関連する記事

PowerShellでpingにタイムスタンプを付加する - 適材適所