Operations Lab.

PowerShell で連続した値を生成する

with one comment

特定範囲の IP アドレスの一覧を生成したい場合など、連続した値(整数値)を生成したい事があります。PowerShell で連続した値を生成する場合は .. 演算子が利用できます。

演算子に関するヘルプは、about_Operators にまとめられています。(Get-Help からも参照できます。)

.. Range operator
Represents the sequential integers in an integer array, given an upper and lower boundary.

初期値と終了値を指定すると、その間の整数を配列として返します。

PS C:\Users\Administrator> (1..10).GetType()

IsPublic IsSerial Name     BaseType
-------- -------- ----     --------
True     True     Object[] System.Array

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

初期値と終了値には小数や負数も記述できます。また、初期値が終了値よりも大きい場合は、逆順で値が生成されます。

PS C:\Users\Administrator> 1.1..5.3
1
2
3
4
5

PS C:\Users\Administrator> -5..3
-5
-4
-3
-2
-1
0
1
2
3

PS C:\Users\Administrator> 2..-2
2
1
0
-1
-2

小数の場合は、整数に丸められた後で連続値が生成されます。

# 1.1 は 1、2.8 は 3 に丸めらえる
PS C:\Users\Administrator> [int]1.1
1

PS C:\Users\Administrator> [int]2.8
3

PS C:\Users\Administrator> [int]1.1..[int]2.8
1
2
3

PS C:\Users\Administrator> 1.1..2.8
1
2
3

PowerShell で小数(浮動小数点型の値)を整数(32bit 符号付整数値)へキャストすると、四捨五入が行われます。もう少し正確には、四捨六入で 0.5 は原則として偶数側へ丸められます。

PS C:\Users\Administrator> [int]0.5
0

PS C:\Users\Administrator> [int]1.5
2

PS C:\Users\Administrator> [int]2.5
2

PS C:\Users\Administrator> [int]3.5
4

PS C:\Users\Administrator> [int]4.5
4

PS C:\Users\Administrator> [int]10.5
10

PS C:\Users\Administrator> [int]11.5
12

一定の間隔で値を生成したい場合は、.. 演算子と四則演算を組み合わせます。1 から順に +10 ずつ 101 までの値を生成したい場合は以下のようになります。(数学の問題ですね。)

PS C:\Users\Administrator> 0..10 | % { $_ * 10 + 1 }
1
11
21
31
41
51
61
71
81
91
101

連続した値は色々なところで使えます。例えば、192.168.0.0/24 のネットワーク内へ ping を実行しホストが存在するかを確認したい場合は、以下のように実行します。

# -n は実行回数、-w はタイムアウト(ミリ秒)
# -w を指定しないと、ホストが ICMP 応答しない場合に時間がかかる
PS C:\Users\Administrator> 1..254 | % { ping -n 1 -w 100 192.168.0.$_ } | Out-Null
PS C:\Users\Administrator> arp -a

インターフェイス: 192.168.0.11 --- 0xa
  インターネット アドレス      物理アドレス      種類
(以下略)

たとえ相手先が ping をフィルターしていたとしても、arp 応答には答えますので、一通り ping を実行した後の arp テーブルを参照すれば、どの IP アドレスが現在使用されているか(オンラインか)分かります。(ついでに MAC アドレスも分かります。)

広告

Written by kazu

2013/03/07 @ 21:39

カテゴリー: PowerShell

Tagged with ,

コメント / トラックバック1件

Subscribe to comments with RSS.

  1. […] 前回の投稿で特定の IP アドレス範囲へ ping を実行する方法を記載しました。簡単なスクリプトで広い範囲に ping を実行できますが、応答を返さないホストが多いと実行終了までに時間がかかります。PowerShell 3.0 からは並列処理ができるようになっていますので、処理を並列化した場合はどうなるのかを試してみました。 […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。