Powershellを使っていると良くあるのがパスとフォルダ名や、パスとファイル名を結合するという場面です。ほとんどの場合パスやファイル名は変数に格納されているので、結合する時に少々工夫が必要になります。
例として、パスが”C:\hoge”でその中に格納された”piyo.txt”というファイルを開くコードを考えます。そのままパスとファイル名を結合すると間に\が無くて動かないので、何らかの方法で\を入れる必要があります。
力技
単純に文字列結合で行うのであればこんな感じになります。
[Powershell]
###パスとファイル名を結合して実行するスクリプト###
#パス変数
$Path = 'C:\hoge'
#ファイル名変数
$Filename = 'piyo.txt'
#パス結合
$Fullpath = $Path +'\'+ $Filename
#ファイル実行
#Invoke-Item $Fullpath
やっていることの分かりやすさという点では良いと思うのですが、結合する対象が3つ以上になると可読性が著しく悪くなるという難点があります。
Microsoft Learnのドキュメントに参考になる情報があったので、これを見ながら改良してみます。
文字列での変数の代入について知りたかったことのすべて
[Microsoft Learn]
変数を置換して結合
変数が含まれる場合でも、二重引用符でくくることによって変数を置換しつつ文字列結合を行うことができます。
最初のコードを書き換えるとこんな感じになります。
[Powershell]
###パスとファイル名を結合して実行するスクリプト###
#パス変数
$Path = 'C:\hoge'
#ファイル名変数
$Filename = 'piyo.txt'
#変数の置換を使ってパス結合
$Fullpath = "$Path\$Filename"
#ファイル実行
Invoke-Item $Fullpath
必ず二重引用符を使う必要があるというところがちょっと難しいですが、可読性という点では良いのではないかと思います。
Join-Pathコマンドを使う
パス結合用のコマンドがあるので、これを使う方法もあります。ドキュメント内で触れられている通り、この方法は\マークのことを気にしなくていいのが便利です。
[Powershell]
###パスとファイル名を結合して実行するスクリプト###
#パス変数
$Path = 'C:\hoge'
#ファイル名変数
$Filename = 'piyo.txt'
#Join-Pathコマンドを使ってパス結合
Join-Path -Path $Path -ChildPath $Filename
#ファイル実行
Invoke-Item $Fullpath
文字数的には冗長になりますが、パスを結合していることが明瞭なので分かりやすさはかなり優れていると思います。
○○について知りたかったことのすべてシリーズはオススメ
Microsoft LearnにKevin Marquette氏が書いているブログエントリが”○○について知りたかったことの全て”という題名で掲載されているのですが、いずれも非常に参考になります。
powershellexplained.com
[powershellexplained.com]
リファレンスほど難解ではなく、Kevin氏の私見も交えてコマンドや構文が紹介されているので今まで知らなかった記述方法やコマンドを知ることができます。