powershell

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

参考

関連記事

  1. powercli

    PowerCLI – オブジェクトの変換

    vSphere Web Services SDK (SDK) と vS…

  2. powershell

    PowerShell -Split 演算子で “.” (ピリオド) を区切り…

    まとめ-Split 演算子の 2 項目は正規表現ピリオドを区切…

  3. powershell

    PowerCLI – PowerShell on Mac

    祝 !! OSS 化。PowerShell が OSS 化され L…

  4. powercli

    Details of host Advanced settings

    まとめESXi ホストの詳細設定一覧を CSV で出力ホストの…

  5. dns

    PowerShell で DNS 操作

    現在、俺々 Lab に vCloud Director (vCD)…

  6. powercli

    PowerShell スクリプト コマンドレットのパラメータに補完機能を

    まとめスクリプト コマンドレット パラメーターの補完は極めて便利…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。










  1. isilon

    VMware Tools on Isilon Virtual Nodes (un…
  2. console

    WebMKS コンソールを等倍にさせる
  3. powershell

    PowerCLI – ダブルクォート内での配列型の変数の展開
  4. netapp

    NetApp Clustered DataONTAP command lines…
  5. key binding

    KeyRemap4MacBook で IntelliJ と Sublime Te…
PAGE TOP
Translate »