2012-05-25 15 views
19

tengo una tabla hash:serie de valores de tabla hash en PowerShell

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

Sé que puedo hacer esto:

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

así que estaba esperando para hacer esto:

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

... pero obtengo esto:

Hello, . 

¿Cómo hago referencia a los miembros de la tabla hash en la interpolación de cadenas?

Respuesta

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

Esos adicionales '' $ símbolos son bastante fea. Esperaba algo mejor. –

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

Esto requiere corchetes adicionales: Write-Host ("Hola {0} {1}." -f ...) –

3

Con la adición de una pequeña función, puede ser un poco más genérico, si lo desea. Tenga cuidado, sin embargo, está ejecutando código potencialmente no confiable en la cadena $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

No se pudo obtener Lemur's answer para trabajar en Powershell 4.0 por lo adaptan como sigue

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