以前 Gist にまとめていたんですが、記事にするのを忘れていたのです。
PowerShell は、文字列の中に変数を埋め込む時にいくつかの手法があります。でもその評価の違いって以外と知られてないようなので、まとめておきましょう。
目次
5つの方法
次 に示す変数をString中に表示することを考えましょう。
大きく5つの方法があります。
このうち、私が良く使うのは、4のインデックス指定か、3の部分式です。5に関しては4と同じなので、普段は使いません。
インデックス指定のメリット
なぜインデックスを多用するかというと、モジュールやリソースを普段書くため、変更に強くするためです。
- 繰り返し利用時に何度も書かなくていい => "{0}-{1}-{0}" -f $hoge.hoge, $fuga
- 変数の変更に強い => 途中で当てる変数を変更したり、順序の変更がインデックス指定なので容易
- シングルクォート
''
の中にも変数を渡せる
過去、部分式を多用していた時期があったのですが、変数の変更やポジションの変更が面倒すぎてやめました。
インデックス指定の注意
さて、4のインデックス指定には注意があります。
このように{}
で括っても評価できます。
問題は、{}
の間に改行が挟まるとパースに失敗します。
どんなシーンかというと、json 中への埋め込みが苦手といえます。
対応方法
以下の2つがあり、私はほとんどの場合 部分式を持ちいて回避しています。というか、部分式を用いるのはHere-Stringへの埋め込みとこのパターンぐらいです。
- 直を使う (但し、後ろの文字が変数の一部として評価される可能性が高いのでだめだめ)
- $() 部分式を使う
こういう意味では、部分式はほぼ影響を受けず使えるので強力な手段といえます。ただし、シングルクォート`''
への埋め込みができないのでインデックスを利用するなりしましょう。
まとめ
- 機能としては部分式最強
- だが、スクリプトなど(変更が発生しえる場合)にはインデックス指定が楽
- ワンライナーなど単純な時は直もあり
PowerShell の String中への変数埋め込みってば罠だらけね!
Gist はこれです : PowerShell のString評価の方法と罠 · GitHub