Posted at

PowerShellを弄るときは & 演算子を使う書き方を覚えておくと便利かも

本エントリはPowerShell Advent Claendar 2018 の3日目の記事です。

簡単な Tips を共有するだけで良いとのことなので小ネタを投下します。

適切なタイトルが思い浮かばなかったので適当ですが Advent Claendar は惰性で追うものなので問題無いと思います。

これまでコマンドプロンプトや Bash で生きてきた人たちがギョームで PowerShell を触っているのを見ていると、配列の引数を渡すときに以下のような書き方をされることが多いと思います。

Verb-Noun1 $hoge, $fuga, $piyo, $moge

やりたい処理がコマンド一発で終わるのであれば、この書き方で問題ないと思います。

ところが、たいていの場合は実行したいことは増えます。仕事は増えるものです。

素直に対応すると以下のようになります。

Verb-Noun1 $hoge, $fuga, $piyo, $moge

Verb-Noun2 $hoge, $fuga, $piyo, $moge

分かりやすいかもしれませんが、冗長さがイケてないですね。

PowerShell に慣れてくると以下のような書き方になってきます。

$hoge, $fuga, $piyo, $moge | Foreach-Object {

Verb-Noun1 $_
Verb-Noun2 $_
}

PowerShell で繰り返し処理を書くときは Foreach-Object ですね。余談ですが、この ScriptBlock の書き方に抵抗を感じる人が多いみたいです。これも特に問題ありません。もしかすると繰り返しのオーバーヘッドがあって前の処理より遅いかもしれませんが、冗長性はなくなりました。

ところが、試行錯誤の中では引数の方が増減することがあります。また、バッチ処理がコケて一部だけ手作業でリトライするようなシチュエーションもあります。このようなとき「一部の引数だけ消して、カンマの位置にも気をつけながらスクリプトを修正」という作業は、わりとストレスフルです。

理由付けに無理やり感がありますが、結論として私が個人的に推奨する書き方は以下のような感じです。

& {

$hoge
$fuga
$piyo
$moge
} | Foreach-Object {
Verb-Noun1 $_
Verb-Noun2 $_
}

& 演算子は、後ろの式(この場合は ScriptBlock)を評価する演算子です。カンマが無くなったので引数が増減したときの微妙なストレスから解放されて嬉しいですね。処理 or 引数を部分的に省略するときもコメントアウトするだけなので楽になりました。diff も綺麗に取れるので VCS との相性も良い気がしています。

以上、PowerShell で何か弄くり回すときに便利な書き方でした。