45

私はハッシュテーブルを持っています:

$hash = @{ First = 'Al'; Last = 'Bundy' }

私はこれができることを知っています:

Write-Host "Computer name is ${env:COMPUTERNAME}"

だから私はこれをしたいと思っていました:

Write-Host "Hello, ${hash.First} ${hash.Last}."

...しかし、私はこれを取得します:

Hello,  .

文字列補間でハッシュテーブルメンバーを参照するにはどうすればよいですか?

4

4 に答える 4

86
Write-Host "Hello, $($hash.First) $($hash.Last)."
于 2012-05-25T12:42:16.340 に答える
22
"Hello, {0} {1}." -f $hash["First"] , $hash["Last"]    
于 2012-05-25T12:45:29.717 に答える
3

必要に応じて、小さな関数を追加することで、もう少し一般的なものにすることができます。ただし、$template文字列内で信頼できない可能性のあるコードを実行していることに注意してください。

Function Format-String ($template) 
{
    # Set all unbound variables (@args) in the local context
    while (($key, $val, $args) = $args) { Set-Variable $key $val }
    $ExecutionContext.InvokeCommand.ExpandString($template)
}

# Make sure to use single-quotes to avoid expansion before the call.
Write-Host (Format-String 'Hello, $First $Last' @hash)

# You have to escape embedded quotes, too, at least in PoSh v2
Write-Host (Format-String 'Hello, `"$First`" $Last' @hash)
于 2013-06-10T21:37:01.737 に答える
0

Lemur の回答を Powershell 4.0 で動作させることができなかったので、次のように調整しました

Function Format-String ($template) 
{
  # Set all unbound variables (@args) in the local context
  while ($args)
  {
    ($key, $val, $args) = $args
    Set-Variable -Name $key.SubString(1,$key.Length-2) -Value $val
  }
  $ExecutionContext.InvokeCommand.ExpandString($template)
}
于 2015-02-19T14:10:54.233 に答える