目次

キーワード

概要

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

更新履歴

ブログ