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. powershell

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

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

  2. powercli

    Details of host Advanced settings

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

  3. powercli

    PowerCLI – オブジェクトの変換

    vSphere Web Services SDK (SDK) と vS…

  4. dns

    PowerShell で DNS 操作

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

  5. powercli

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

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

  6. powershell

    PowerCLI – PowerShell on Mac

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

コメント

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

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










  1. nested esxi

    esx-tools-for-esxi を vSphere 5.0 にインストール…
  2. virtual san

    Virtual SAN – RAID-5/6
  3. powercli

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

    iptables configuration for QUADStor
  5. quadstor

    QUADstor Installation & Configuratio…
PAGE TOP
Translate »