適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

PowerShellっぽいpingの連続送信

コマンドプロンプトではなくPowershellを使う

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にタイムスタンプを付加する - 適材適所