对某人来说,这肯定是轻而易举的事。当我在字符串中引用数组项时,它不会产生所需的结果。我期望最后一个语句产生一个包含" abc"的字符串,但它没有。
PS C:\src\powershell> $mylist = @("abc", "def")
PS C:\src\powershell> $mylist
abc
def
PS C:\src\powershell> $mylist[0]
abc
PS C:\src\powershell> $mylist[1]
def
PS C:\src\powershell> "$mylist[0]"
abc def[0]s
答案 0 :(得分:3)
注意:虽然这个答案涵盖了PowerShell中字符串插值的许多方面,但可以在我的this answer中找到对该主题的更全面的处理。
在双引号字符串中嵌入变量引用时,只能嵌入简单变量引用而不将表达式括在所谓的子表达式运算符$(...)
中:
> $mylist = @("abc", "def") # define an array
> "$mylist[0]" # WRONG: $mylist (the whole array) is expanded, and "[0]" is a literal.
abc def[0]
> "$($mylist[0])" # OK: $(...) ensures that the subscript is recognized.
abc
更准确地说,您可以直接嵌入以下变量引用 in double-quoted strings / here-strings < / strong>为了扩展(插值):
"I'm $HOME."
"I'm on a spiritual $env:PATH."
要从后续字符中 消除变量名称,将其括在{...}
;例如,
"I'm ${HOME}:"
请注意,如果没有{...}
,最终:
将被解释为变量名称的一部分,并且会导致错误。
或者,您可以将:
转义为`:
,同样,使用`$
转义(创建文字)$
< /强>
其他所有内容 ,包括访问数组变量&lt; 下标 或对象变量属性 ,您需要子表达式运算符$(...)
。
请注意, $(...)
允许您在字符串中嵌入整个命令行 ; e.g:
> "Today is $((Get-Date).ToString('d'))."
Today is 10/13/16. # en-US culture
文档说明:Get-Help about_Quoting_Rules
涵盖了字符串插值,但是,从PSv5开始,不是深入的。
对于构建字符串的 替代到字符串插值(扩展),请参阅Ansgar Wiecher's answer。
答案 1 :(得分:1)
在扩展字符串中的变量时,PowerShell无法识别更复杂的变量构造(例如索引操作($mylist[0]
)或属性/方法访问($mylist.Count
))。它将简单地扩展变量并保留字符串的其余部分。因此,"$mylist[0]"
表达式变为"abc def[0]"
。
基本上,您有三种方法可以解决此限制:
"-$($mylist[0])-"
"-{0}-" -f $mylist[0]
使用字符串连接:
"-" + $mylist[0] + "-"
当然还有更多“异国情调”的方法,比如使用-join
运算符:
"-", $mylist[0], "-" -join ""
或替换操作:
'-%x%-' -replace '%x%', $mylist[0]
'-%x%-'.Replace('%x%', $mylist[0])
但那些已经接近混淆的那些。