2012-05-25 2 views
19

J'ai une Hashtable:interpolation de chaîne de valeurs Hashtable dans PowerShell

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

Je sais que je peux le faire:

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

J'espérais faire:

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

... mais je reçois ceci:

Hello, . 

Comment référencer les membres de la table de hachage dans l'interpolation de chaîne?

Répondre

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

Ces supplémentaires '' $ symboles sont assez laids. J'espérais quelque chose de plus agréable. –

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

Cela nécessite des crochets supplémentaires: Write-Host ("Hello {0} {1}." -f ...) –

3

Avec l'ajout d'une petite fonction, vous pouvez être un peu plus générique, si vous le souhaitez. Attention cependant, vous exécutez du code potentiellement non fiable dans la chaîne $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

Impossible d'obtenir Lemur's answer pour travailler dans Powershell 4.0 si adapté comme suit

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