PowerShellでLINQのメソッドチェーンみたいな書き方ができるようになっている

LINQ使っていると、メソッドチェーンでプログラム書く面白味を感じます。
頭の中の思考をそのまま、ダイレクトに反映させていける感覚が好きです。

PowerShellもバージョン4になって配列などのオブジェクトに対してWhereやForEachをLINQ的に使えるようになったようです。
PowerTip: Learn to Use Where or ForEach in PowerShell 4.0 - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs

PowerShellには強力なパイプラインの機能がありますが、こんな書き方ができるというのを知っていても面白いかもしれません。


例えばある配列から"+"を含む要素の個数を書くときなんかはこんな風にかけます。

PS > $arr = "a+","b","c+","d","e-","f+","g-"
PS > $arr.Where({$PSItem.Contains("+")}).Count
3

$PSItemというの変数がこの書き方のキーになります。

今度は"+"を含む要素を書き出してみます。

PS > $arr = "a+","b","c+","d","e-","f+","g-"
PS > $arr.Where({$PSItem.Contains("+")}).ForEach({$PSItem})
a+
c+
f+


ちょっと応用すればもう少し複雑な処理も書けます。
現在のフォルダからディレクトリは抜いてファイルの名前を一覧する場合の例です。

PS> @(Get-ChildItem).Where({$PSItem.GetType().Name -eq "FileInfo"}).ForEach({$PSItem.Name})

リンク先にもあった、notepadプロセスを停止する場合の例です。

PS> @(Get-Process –Name notepad).ForEach({ Stop-Process -InputObject $PSItem; }).


PowerShell便利ですね。