最近、Windows PowerShellでプログラムを書くことが好きです。コマンドプロンプトで書けるプログラムもPowerShellで書くようになりました。
理由は他のプログラミング言語に近い書式で記述ができますし、統合環境のWindows PowerShell ISEを使用すれば、効率良くプログラムが作成できます。
一度PowerShellを使うと、コマンドプロンプトに戻れなくなってしまうぐらい、使い勝手が良いです。
さて、PowerShellで変数を展開する場合は色々と方法があります。
特に文字列内で変数を扱う際は注意が必要です。変数を展開する書式によっては、正常に展開されない場合があります。
そこで、PowerShellの文字列内で変数を扱う方法についてまとめてみました。
目次
文字列内で変数を展開する方法
まず、PowerShellでは文字列内で変数を展開する方法は以下の方法があります。
それぞれ特徴がありますので、一つずつ見ていきましょう。
- 変数を直接指定する方法
- ${}で変数を括る方法
- $()で変数を括る方法
- "{[インデックス値]}" -f [変数],…で指定する方法
変数を直接指定する方法
変数を直接指定して展開する方法です。一番簡単な展開方法です。
しかし、変数名が特定できる場合のみでしか、変数を展開することができません。
変数展開が条件付きですので、あまりオススメはしません。
$var = "Peach" # 変数を「$var」と判断し、展開する "I like $var." # => I like Peach. # 変数の後ろの文字列により、変数を「$var」なのか判断できないため、展開できない "I like $varJuice." # => I like .
${}で変数を括る方法
特殊文字を含む変数名を扱う際の展開方法です。Rubyなど使用している方は馴染みがある書式ですね。
基本的には問題なく変数展開が可能ですが、配列型変数でインデックスを指定する場合は展開できないので注意が必要です。
$var = "Peach" $array = "Apple", "Banana", "Grape" # 変数を展開する "I like ${var}Juice." # => I like PeachJuice. # インデックスを指定しない場合、配列内の要素を全て展開する "I like ${array}Juice." # => I like Apple Banana GrapeJuice. # インデックスを指定する場合、配列内の要素を取得できない "I like ${array[0]}Juice." # => I like Juice.
$()で変数を括る方法
$()で括った式を評価した後、結果を返します。部分式演算子と呼びます。
特徴は「${}」でできなかった、配列型変数をインデックス付きで展開することができます。
しかし、書式は「${}」と少し異なり、「$()」内で指定する変数は「$[変数名]」で指定が必要です。
$var = "Peach" $array = "Apple", "Banana", "Grape" # 変数を展開する "I like $($var)Juice." # => I like PeachJuice. # インデックスを指定しない場合、配列内の要素を全て展開する "I like $($array)Juice." # => I like Apple Banana GrapeJuice. # インデックスを指定する場合、インデックス値に対応した配列の要素を展開する "I like $($array[0])Juice." # => I like AppleJuice.
"{[インデックス値]}" -f [変数]で指定する方法
[変数]を「,(カンマ)」で区切ることにより、複数の変数指定が可能です。書式設定演算子と呼びます。
本来は文字列を書式設定するための記法ですが、文字列内に変数を展開する方法としても使用できます。
自由度が高く、文の後方で変数をまとめている為、何の変数を使用しているかわかりやすいのが良いです。
ただ、自由度が高い反面、他の書式と比べて書式の難易度が高いです。
$var1 = "Peach" $var2 = "Strawberry" $array = "Apple", "Banana", "Grape" # インデックス値に対応した変数を展開する "I like {0}Juice." -f $var1 # => I like PeachJuice. "I like {1}Juice." -f $var1, $var2 # => I like StrawberryJuice. # インデックス値に対応した配列の要素を展開する "I like {0}Juice." -f $array # => I like AppleJuice. # 変数と配列の組み合わせの場合、配列の要素は展開できない(変数は展開できる) "I like {0}Juice." -f $array, $var2 # => I like System.Object[]Juice.
まとめ
PowerShellの文字列内で変数を展開する方法を紹介しました。
文字列内の変数展開はこれでするべき!っというのは特にないです。自分が使いやすい書式、または用途に合わせた書式を使用しましょう。
私は${}、$()を使うことが多いですね。。。書式設定演算子はまだ使ったことがないので、今度使ってみようと思います。
最後に本記事のまとめです。
- 変数直接指定はあまりオススメしない
- ${}は配列型変数のインデックス指定ができない
- $()は基本的に万能
- "{[インデックス値]}" -f [変数]は基本的に万能