格式化包含哈希表值的Powershell字符串

时间:2012-03-02 21:02:28

标签: powershell format hashtable

答案可能很简单,但我花了半个小时仍然无法解决问题。

假设我有以下哈希表:

$hash = @{face='Off';}

我试图做的是将“face”的值与其他一些字符串元素一起输出。

这有效:

Write-Host Face $hash['face']
=> Face Off

然而,这不是:

Write-Host Face/$hash['face']
=> Face/System.Collections.Hashtable[face]

某种程度上缺少空间会影响运算符的优先级 - 现在它正在将$ hash作为一个字符串进行评估,之后是连接[face]。

试图解决这个优先级问题,我试过了:

Write-Host Face/($hash['face'])
=> Face/ Off

我现在有一个我不想要的额外空间。 这有效,但我不希望额外的行重新分配:

$hashvalue = $hash['face']
write-host Face/$hashvalue
=> Face/Off

知道如何让它作为单行工作吗?

4 个答案:

答案 0 :(得分:9)

当然,使用子表达式:

Write-Host Face/$($hash['face'])

一般来说,如果我需要使用Write-Host对空白进行精确控制,我只会使用一个字符串:

Write-Host "Face/$($hash['face'])"

是的,在这种情况下,您需要再次使用子表达式,但更多是因为您不能在字符串中包含$foo['bar']这样的表达式,否则; - )

顺便说一句,$hash.face同样适用于视觉上的混乱。

答案 1 :(得分:3)

在这种情况下,如果涉及更多变量,我更喜欢使用字符串格式。虽然在这种情况下你可以使用$(..),但请注意字符串格式化将消除许多疑点,残缺并提高可读性:

write-host ("Face/{0}" -f $hash['face'])

答案 2 :(得分:1)

除了使用Joey所示的子表达式,您还可以:

使用字符串格式:

Write-Host ('Face/{0}' -f $hash.face)

这会将face键的值粘贴在{0}

的位置

使用字符串连接:

Write-Host ('Face/' + $hash.face)

这两个都需要一个要计算的表达式,它输出一个用作Write-Host的{​​{1}}参数的字符串。

答案 3 :(得分:0)

另一种选择是使用Write-Host的-Separator选项插入斜杠:

$hash = @{Face="off"}
Write-Host ("Face",$hash.Face) -Separator '/'