2012-05-25 14 views
19

Ho una tabella hash:String interpolazione dei valori Hashtable in PowerShell

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

So che posso fare questo:

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

quindi speravo di fare questo:

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

... ma ottengo questo:

Hello, . 

Come si fa riferimento ai membri della tabella hash nell'interpolazione stringa?

risposta

41
Write-Host "Hello, $($hash.First) $($hash.Last)." 
+7

quelli extra '$' simboli sono abbastanza brutto. Speravo in qualcosa di più bello. –

12
"Hello, {0} {1}." -f $hash["First"] , $hash["Last"]  
+2

Ciò richiede parentesi aggiuntive: Write-Host ("Hello {0} {1}." -f ...) –

3

Con l'aggiunta di una piccola funzione, si può essere un po 'più generico, se lo si desidera. Attenzione, però, stai eseguendo codice potenzialmente non sicuro nella stringa $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) 
0

Impossibile ottenere Lemur's answer a lavorare in PowerShell 4.0 in modo adattato come segue

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) 
}