概要
if, while, for などの制御構文に加えて、 パイプラインを通したオブジェクトの処理用に、 Where-Object や ForEach-Object などの Cmdlet があります。 慣れると制御構文の方の foreach や if などよりも便利かも。
ForEach-Object
一番分かりやすいのは、制御構文に同じ名前の物がある ForEach-Object でしょうか。 パイプラインで受け取ったオブジェクトに対して処理を行うもので、 以下のように使います。
> 1,2,3,4 | ForEach-Object { $_ * $_ }
1
4
9
16
ForEach-Object は第1引数に「スクリプトブロック」を受け取ります。 $_ 自動変数を使ってオブジェクトに対する処理を書きます。
ForEach-Object は頻繁に使うものなので、 利便性を考えて「エイリアス」が設定されていて、 foreach という名前と、% という名前でも呼び出せます。
> 2,3,4 | foreach { $_ * $_ } 4 9 16 > 2,3,4 | %{ $_ * $_ } 4 9 16
その他、オプションで、begin ブロックと end ブロックも受け取れます。 (挙動は関数の begin, process, end と同じ。 「begin, process, end」参照。)
> 2,3,4 | % -begin {$num = 0} -process {++$num; $_} -end {"total $num"}
2
3
4
total 3
Where-Object
ForEach-Object 以外に、 SQL クエリ的な使い方のできる Where-Object などの Cmdlet もあります。
まず、Where-Object ですが、 パイプライン中のオブジェクトのうち、 指定した条件を満たすものだけを取り出します。 条件式は、やはり $_ を使って書きます。
> 1,9,3,7,5 | Where-Object {$_ -le 5}
1
3
5
Where-Object にも「エイリアス」が設定されていて、 where と ? でも呼び出せます。
> 1,9,3,7,5 | where {$_ -le 5} 1 3 5 > 1,9,3,7,5 | ?{$_ -le 5} 1 3 5
まあ、要するに、以下の foreach と同じ挙動です。
> 1,9,3,7,5 | %{if($_ -le 5) {$_}}
1
3
5
Select-Object
Select-Object Cmdlet は、パイプラインから受け取ったオブジェクトのうち、 特定のプロパティのみを取り出したオブジェクトを出力します。
> ls C:\WINDOWS\Web\*.gif | Select-Object Name, LastWriteTime
Name LastWriteTime
---- -------------
bullet.gif 2004/08/05 21:00:00
exclam.gif 2004/08/05 21:00:00
tips.gif 2004/08/05 21:00:00
これも select というエイリアスが付いています。 where と合わせて、SQL クエリチックな書き方ができます。
> ls C:\WINDOWS | where {$_.Name -like "d*"} | select Name, LastWriteTime Name LastWriteTime ---- ------------- Debug 2007/05/10 16:15:20 DOCS 2005/03/24 13:22:35 DOTNETFX 2005/03/24 13:22:43 後略
Group-Object
Group-Object (エイリアス: group)は、 同じプロパティの値を持つオブジェクトをグループ化します。 (SQL の Group By に相当。) 例えば、以下の通り。
> ls C:\WINDOWS\Web | group Extension
Count Name Group
----- ---- -----
2 {printers, Wallpaper}
3 .gif {bullet.gif, exclam.gif, tips.gif}
2 .htt {deskmovr.htt, safemode.htt}
1 .htm {tip.htm}
ちなみに、Group-Object の出力結果の型は Microsoft.PowerShell.Commands.GroupInfo の配列です。 GroupInfo は Name や Values などのプロパティを持っています。
> ls C:\WINDOWS\Web | group Extension | ?{$_.Name -like ".h*"}
Count Name Group
----- ---- -----
2 .htt {deskmovr.htt, safemode.htt}
1 .htm {tip.htm}
Sort-Object
もう1個、SQL の sort by に相当する Sort-Object (エイリアス: sort)もあります。
> ls C:\WINDOWS\Web | sort LastWriteTime, Name | select Name, LastWriteTime
Name LastWriteTime
---- -------------
bullet.gif 2004/08/05 21:00:00
deskmovr.htt 2004/08/05 21:00:00
exclam.gif 2004/08/05 21:00:00
safemode.htt 2004/08/05 21:00:00
tip.htm 2004/08/05 21:00:00
tips.gif 2004/08/05 21:00:00
printers 2005/03/24 12:50:06
Wallpaper 2005/03/24 13:07:57