我不明白为什么这个脚本中的字符串连接会有所不同。我真的不明白空格是从哪里来的?你能告诉我出什么事了吗?
$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"发布于 2009-04-12 21:46:48
在处理命令的参数时,如果第一个片段是可识别的表达式,则PowerShell解析器会将相邻的表达式拆分为离散的参数,就像$()的情况一样。因为PowerShell是基于对象的,所以我们试图保持对象的完整性,直到我们完全必须呈现为字符串。如果你想强制字符串扩展,就像其他发帖建议的那样,在整个参数序列两边加上双引号。请注意,具有$x之类前导字符的参数将被视为双引号字符串" a$x“。这是因为前导字符没有被识别为有效的表达式,所以我们默认将其视为可扩展的字符串。
-bruce
微软公司视窗PowerShell团队的布鲁斯·佩耶特
发布于 2009-04-10 04:56:08
这不仅仅发生在哈希表的关键字上。例如,看看这个:
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 <<<<所以必须发生的是,在将$x.Length$y传递给写主机之前,powershell将它们解释为两个单独的表达式,并且由于有两个表达式,写主机用分隔符将它们分开。
那么这里发生了什么呢?:
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在将$x$y作为单个参数传递给Write-Host之前,Powershell必须将其转换为字符串。
然而,基本上这一切都只是猜测。对我来说,这听起来很有道理。简短的答案是,您可以自己将字符串连接在一起,以消除空格:
Write-Host ($_.Key + $x)发布于 2009-04-10 15:07:44
您好,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解析器你想要扩展该对象上的属性,并将值放入字符串中任何后面/之前的内容。
詹姆斯
https://stackoverflow.com/questions/734616
复制相似问题