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] を評価してから文字列内の変数展開を行うため、配列の添字などの影響を受けません。

参考