为什么哈希表键上有空格?

时间:2009-04-09 15:00:20

标签: powershell

我不明白为什么这个脚本中的字符串连接存在差异。 我真的不明白这个空白来自哪里? 你能告诉我什么是错的吗?

$table = @{
"aaa"=1
}

$x = "qqq"
$y = "rrr"

$table.GetEnumerator() | ForEach-Object { 
Write-Host $_.Key$x            #THIS PRINTS "aaa qqq"
}


Write-Host $x$y   #THIS PRINTS : "qqqrrr"

4 个答案:

答案 0 :(得分:8)

当处理命令的参数时,如果第一个片段是可识别的表达式,那么PowerShell解析器会将相邻的表达式拆分为离散的参数,就像$()的情况一样。因为PowerShell是基于对象的,所以我们尝试保持对象完整性,直到我们绝对必须渲染为字符串。如果你想强制字符串扩展,请在整个参数序列周围加上双引号作为其他海报的建议。请注意,带有前导字符(如$ x)的参数将被视为双引号字符串“a $ x”。这是因为前导字符不被识别为有效表达式,因此我们默认将其视为可扩展字符串。

-Bruce

Bruce Payette, Windows PowerShell团队, 微软公司

答案 1 :(得分:2)

这不仅仅是哈希表键。比如说:

PS > Write-Host $x.Length$y
3 rrr

$x.Length$y不是有效的表达式:

PS > $x.Length$y
Unexpected token 'y' in expression or statement.
At line:1 char:11
+ $x.Length$y <<<<

所以必须发生的是PowerShell在将$x.Length$y传递给Write-Host之前将它们解释为两个单独的表达式,并且由于它们有两个,Write-Host用分隔符将它们分开。

那么这里发生了什么?:

PS > Write-Host $x$y
qqqrrr

$x$y也不是有效的表达式:

PS > $x$y
Unexpected token 'y' in expression or statement.
At line:1 char:4
+ $x$y <<<<

但是,使用双引号时,它是一个有效的字符串:

PS > "$x$y"
qqqrrr

Powershell必须将$x$y转换为字符串,然后再将其作为单个参数传递给Write-Host。

然而,基本上这只是猜测。这对我来说听起来似乎有道理。简短的回答是,您可以自己将字符串连接在一起以摆脱空间:

Write-Host ($_.Key + $x)

答案 2 :(得分:1)

恕我直言,Powershell解析器正在进行

Write-Host $_.Key$a

通过拆分'$'将其标记为两个表达式。实际上,向管道发出两个命令:

Write-Host $_.Key
$x

我认为这主要是因为您正在访问一个属性并将其扩展为一个变量旁边的字符串,当它被评估成为一个字符串时。

你应该这样做的方式是:

PS C:\Users\jpogran> $table = @{
>> "aaa"=1
>> }
>>
PS C:\Users\jpogran> $x = "qqq"
PS C:\Users\jpogran> $y = "rrr"
PS C:\Users\jpogran> $table

Name                           Value
----                           -----
aaa                            1
PS C:\Users\jpogran> $table.Getenumerator() | %{ Write-host "$($_.key)$x" }
aaaqqq

'$()'告诉Powershell解析器你想要扩展该对象上的属性,并将值放在字符串旁边的/之后的任何内容中。

詹姆斯

答案 3 :(得分:0)

如果连接密钥和$ x会发生什么?

$ _。按键+ $ x

Write-Host似乎有一个语法,您可以输入变量并将它们分开:Write-Host(a,b,c)-separator“_”

也许您正在使用的是速记?