首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么哈希表的键上有尾随的空格?

为什么哈希表的键上有尾随的空格?
EN

Stack Overflow用户
提问于 2009-04-09 15:00:20
回答 4查看 667关注 0票数 1

我不明白为什么这个脚本中的字符串连接会有所不同。我真的不明白空格是从哪里来的?你能告诉我出什么事了吗?

代码语言:javascript
运行
复制
$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"
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-12 21:46:48

在处理命令的参数时,如果第一个片段是可识别的表达式,则PowerShell解析器会将相邻的表达式拆分为离散的参数,就像$()的情况一样。因为PowerShell是基于对象的,所以我们试图保持对象的完整性,直到我们完全必须呈现为字符串。如果你想强制字符串扩展,就像其他发帖建议的那样,在整个参数序列两边加上双引号。请注意,具有$x之类前导字符的参数将被视为双引号字符串" a$x“。这是因为前导字符没有被识别为有效的表达式,所以我们默认将其视为可扩展的字符串。

-bruce

微软公司视窗PowerShell团队的布鲁斯·佩耶特

票数 8
EN

Stack Overflow用户

发布于 2009-04-10 04:56:08

这不仅仅发生在哈希表的关键字上。例如,看看这个:

代码语言:javascript
运行
复制
PS > Write-Host $x.Length$y
3 rrr

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

代码语言:javascript
运行
复制
PS > $x.Length$y
Unexpected token 'y' in expression or statement.
At line:1 char:11
+ $x.Length$y <<<<

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

那么这里发生了什么呢?:

代码语言:javascript
运行
复制
PS > Write-Host $x$y
qqqrrr

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

代码语言:javascript
运行
复制
PS > $x$y
Unexpected token 'y' in expression or statement.
At line:1 char:4
+ $x$y <<<<

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

代码语言:javascript
运行
复制
PS > "$x$y"
qqqrrr

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

然而,基本上这一切都只是猜测。对我来说,这听起来很有道理。简短的答案是,您可以自己将字符串连接在一起,以消除空格:

代码语言:javascript
运行
复制
Write-Host ($_.Key + $x)
票数 2
EN

Stack Overflow用户

发布于 2009-04-10 15:07:44

您好,Powershell解析器正在使用

代码语言:javascript
运行
复制
Write-Host $_.Key$a

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

代码语言:javascript
运行
复制
Write-Host $_.Key
$x

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

你应该这样做:

代码语言:javascript
运行
复制
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解析器你想要扩展该对象上的属性,并将值放入字符串中任何后面/之前的内容。

詹姆斯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/734616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档