如何在字符串中展开(插入)数组元素

时间:2016-10-14 00:25:55

标签: powershell string-interpolation

对某人来说,这肯定是轻而易举的事。当我在字符串中引用数组项时,它不会产生所需的结果。我期望最后一个语句产生一个包含" 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

2 个答案:

答案 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]"

基本上,您有三种方法可以解决此限制:

当然还有更多“异国情调”的方法,比如使用-join运算符:

"-", $mylist[0], "-" -join ""

或替换操作:

'-%x%-' -replace '%x%', $mylist[0]
'-%x%-'.Replace('%x%', $mylist[0])

但那些已经接近混淆的那些。