2012-05-25 28 views
19

Tôi đã có một Hashtable:Chuỗi suy các giá trị trong hashtable PowerShell

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

Tôi biết rằng tôi có thể làm điều này:

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

Vì vậy, tôi đã hy vọng để làm điều này:

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

... nhưng tôi nhận được điều này:

Hello, . 

Làm cách nào để tôi tham chiếu thành viên bảng băm trong nội suy chuỗi?

Trả lời

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

Những phụ '$ 'những biểu tượng là khá xấu xí. Tôi đã hy vọng cho một cái gì đó đẹp hơn. –

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

Điều này yêu cầu thêm dấu ngoặc: Viết-Máy chủ ("Xin chào {0} {1}." -f ...) –

3

Với việc bổ sung một chức năng nhỏ, bạn có thể chung chung hơn một chút, nếu bạn muốn. Xem ra, mặc dù, bạn đang thực thi mã có khả năng không đáng tin cậy trong chuỗi $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

Không thể lấy Lemur's answer để làm việc trong Powershell 4.0 để chuyển thể như sau

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) 
} 
Các vấn đề liên quan