这对某人来说肯定很容易。当我引用字符串中的数组项时,它不会产生所需的结果。我希望最后一个语句生成一个包含"abc"的字符串,但它没有。
PS C:srcpowershell> $mylist = @("abc", "def")
PS C:srcpowershell> $mylist
abc
def
PS C:srcpowershell> $mylist[0]
abc
PS C:srcpowershell> $mylist[1]
def
PS C:srcpowershell> "$mylist[0]"
abc def[0]s
注意:虽然这个答案涵盖了PowerShell中字符串插值的许多方面,但在这个答案中可以找到对该主题的更全面的处理
在双引号字符串中嵌入变量引用时,只有简单变量引用才能嵌入,而无需将表达式封装在所谓的子表达式运算符$(...)
:中
PS> $mylist = @("abc", "def") # define an array
PS> "$mylist[0]" # WRONG: $mylist (the whole array) is expanded, and "[0]" is a literal.
abc def[0]
PS> "$($mylist[0])" # OK: $(...) ensures that the subscript is recognized.
abc
更准确地说,您可以直接在双引号字符串/此处字符串中嵌入以下变量引用,以便对其进行扩展(插值(:
- 仅通过名称引用的变量;例如
"I'm $HOME."
- 带有作用域说明符的变量;例如
"I'm on a spiritual $env:PATH."
若要从后续字符中消除变量名的歧义,请将其括在{...}
中;例如,"I'm ${HOME}:"
请注意,如果没有{...}
,最终的:
将被解释为变量名的一部分,并会导致错误
或者,您可以将:
转义为`:
,类似地,使用`$
转义(创建文字($
。
对于所有其他,包括访问数组变量的下标或对象变量的属性[/strong>,您需要子表达式运算符$(...)
请注意,$(...)
允许您将整个命令行嵌入到字符串中;例如:
PS> "Today is $((Get-Date).ToString('d'))."
Today is 10/13/16. # en-US culture
文档说明:Get-Help about_Quoting_Rules
涵盖字符串插值,但从PSv5开始,尚未深入
对于构建字符串的字符串插值(扩展(的替代方案,请参见Ansgar Wiecher的答案。
PowerShell在扩展字符串中的变量时无法识别更复杂的变量构造(例如,索引操作($mylist[0]
(或属性/方法访问($mylist.Count
((。它将简单地展开变量,并保留字符串的其余部分。因此表达式CCD_ 17变为CCD_。
基本上,你有三种选择来处理这个限制:
-
使用子表达式:
"-$($mylist[0])-"
-
使用格式运算符:
"-{0}-" -f $mylist[0]
-
使用字符串串联:
"-" + $mylist[0] + "-"
当然,还有更"奇特"的方法,比如使用-join
运算符:
"-", $mylist[0], "-" -join ""
或更换操作:
'-%x%-' -replace '%x%', $mylist[0]
'-%x%-'.Replace('%x%', $mylist[0])
但这些已经濒临混淆。