2012-03-02 94 views
6

对此的答案很可能是微不足道的,但我已花了半个小时,仍然无法解决问题。格式化包含散列表值的Powershell字符串

假设我有以下的散列表:

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

我所试图做的,是输出的“面子”其他一些字符串元素的值的旁边。

这工作:

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

然而,这并不:

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

不知怎的,缺乏空间,影响了运算符优先级 - 它正在评估$哈希为一个字符串,之后连接[face]。

试图解决这个问题的优先级,我想:

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

我现在有一个额外的空间,我不想。 这工作,但我不希望额外的行只是为了重新分配:

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

任何想法如何得到这个工作作为一个班轮?

回答

9

当然,使用一个子表达式:

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

一般情况下,我只用一个字符串,如果我需要写主机通过空格进行精确控制:

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

是的,在这您需要再次使用子表达式,但更多的原因是您无法在字符串中包含像$foo['bar']这样的表达式;否则;-)

顺便说一下,$hash.face与少得多的视觉混乱一起工作。

+0

子表达式是这里的关键(括在$())。我隐约知道他们的角色,但在这里错过了适用性。 – llevera 2012-03-02 21:34:55

+0

不接受给他人回答的机会。有点快速的块 – llevera 2012-03-02 21:52:11

3

在这种情况下,更多的情况下,如果涉及更多的变量,我更喜欢使用字符串格式。而在这种情况下,你可以用$(..)生活,要知道,字符串格式化将删除疑点颇多,克鲁夫特,提高了可读性:

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

感谢您指出-f选项。我从来没有使用过,我可以肯定地看到它将如何使更复杂的场景变得更易于管理 – llevera 2012-03-03 00:41:28

+1

llevera,它是一个运营商,而不是一个选项。 – Joey 2012-03-03 09:46:50

1

除了使用子表达式为乔伊表明您可以:

使用字符串格式化:

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

这将粘在{0}

使用字符串连接的地方面对键的值:

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

那些这两者都需要进行评估,其输出被用作Write-HostObject参数字符串的表达式。

+0

我认为值得注意的是,对于写主机('Face /'+ $ hash.face)示例,括号非常重要。没有它们,+会被视为字符串文字。 Powershell字符串格式化需要一点习惯! – llevera 2012-03-03 00:31:13

+0

@llevera是的parens告诉PowerShell首先执行字符串连接。输出是一个System.String对象,它用作'Write-Host-Object'参数值。 – 2012-03-03 00:38:54

0

另一种选择是用写主机的-Separator选项插入您的斜线:

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