PowerCLI – ダブルクォート内での配列型の変数の展開
PowerCLI に限った話ではないのですが、PowerCLI のスクリプトを作成する中で嵌まったので記録に残します。
遭遇した問題
ダブルクォートで作成した文字列において、配列型の変数を展開することが出来ない。
PS C:\Users\Administrator> $buildId = '6.0.0-4192238-p03' -split '-'
PS C:\Users\Administrator> "VMware-VMvisor-Installer-$buildId[0]-$buildId[1].x86_64.iso"
VMware-VMvisor-Installer-6.0.0 4192238 p03[0]-6.0.0 4192238 p03[1].x86_64.iso
PS C:\Users\Administrator> "VMware-VMvisor-Installer-${buildId}[0]-${buildId}[1].x86_64.iso"
VMware-VMvisor-Installer-6.0.0 4192238 p03[0]-6.0.0 4192238 p03[1].x86_64.iso
PS C:\Users\Administrator>
本来は VMware-VMvisor-Installer-6.0.0-4192238.x86_64.iso という文字列が返ってきて欲しいのですが、配列の要素を上手く取り出せていません。
おさらい
PowerShellではダブルクォートで文字列を作成する場合、その中の変数の値を文字列に展開することができます。
PS C:\Users\Administrator> $worldName = 'PowerShell'
PS C:\Users\Administrator> "Hello World, $worldName"
Hello World, PowerShell
PS C:\Users\Administrator>
しかし、変数が最後ではなかったり、変数の後にスペースが来ない場合などは、この記述方法では上手くいきません。そこで変数を ${} の形式で記述し、どこまでが変数名かを識別できるようにします。
PS C:\Users\Administrator> $version = '6.0.0'
PS C:\Users\Administrator> $build = '4192238'
PS C:\Users\Administrator> "VMware-VMvisor-Installer-${version}-${build}.x86_64.iso"
VMware-VMvisor-Installer-6.0.0-4192238.x86_64.iso
PS C:\Users\Administrator>
しかし、この ${version} や ${build} といった変数が添字付となると上手くいかなくなります。
PS C:\Users\Administrator> $buildId = '6.0.0-4192238-p03' -split '-'
PS C:\Users\Administrator> "VMware-VMvisor-Installer-$buildId[0]-$buildId[1].x86_64.iso"
VMware-VMvisor-Installer-6.0.0 4192238 p03[0]-6.0.0 4192238 p03[1].x86_64.iso
PS C:\Users\Administrator> "VMware-VMvisor-Installer-${buildId}[0]-${buildId}[1].x86_64.iso"
VMware-VMvisor-Installer-6.0.0 4192238 p03[0]-6.0.0 4192238 p03[1].x86_64.iso
PS C:\Users\Administrator>
解決
これを解決するには PowerShell の Sub-Expression Operator $() を利用します。式中に $() がある場合、$() 内部を先に評価してから式の評価を行います。では Sub-Expression Operator を使って再度実行してみます。
PS C:\Users\Administrator> $buildId = '6.0.0-4192238-p03' -split '-'
PS C:\Users\Administrator> "VMware-VMvisor-Installer-$($buildId[0])-$($buildId[1]).x86_64.iso"
VMware-VMvisor-Installer-6.0.0-4192238.x86_64.iso
PS C:\Users\Administrator>
@() 内部の $buildId[0] を評価してから文字列内の変数展開を行うため、配列の添字などの影響を受けません。