如何扩展(插入)字符串中的数组元素

How to expand (interpolate) an array element in a string

这对某人来说肯定是随和的。当我在字符串中引用数组项时,它没有产生所需的结果。我希望最后一条语句产生一个包含 "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

注意:虽然此答案涵盖了 PowerShell 中字符串插值的许多方面,但可以在 this answer.[=29= 中找到对该主题的更全面的处理]

在双引号字符串中嵌入变量引用时,只能嵌入简单变量引用,而无需将表达式括在所谓的子表达式运算符中,$(...)

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

更准确地说,你可以直接嵌入以下变量引用double -quoted strings / here-strings 以便扩展(插值):

  • 一个 仅按名称引用的变量;例如,"I'm $HOME."
  • 一个带有作用域说明符的变量;例如,"I'm on a spiritual $env:PATH."

消除一个变量名与后续字符的歧义,将其包含在{...}[=82中=];例如,
"I'm ${HOME}:"
请注意,如果没有 {...},最后的 : 将被解释为变量名称的一部分,并会导致错误。
或者,您可以将 : 转义为 `:,类似地, 使用 `$ 转义(创建 文字 $.

对于其他所有,包括访问数组变量的下标 对象变量的 属性,你需要 子表达式运算符,$(...).
请注意 $(...) 允许您将 整个命令行 嵌入到一个字符串中;例如:

PS> "Today is $((Get-Date).ToString('d'))."
Today is 10/13/16.                         # en-US culture

文档说明:Get-Help about_Quoting_Rules 涵盖了字符串插值,但从 PSv5 开始,并不深入。


对于字符串插值(扩展)的替代方法,请参阅

PowerShell 在扩展字符串中的变量时无法识别更复杂的变量结构(例如索引操作 ($mylist[0]) 或 property/method 访问 ($mylist.Count))。它只会扩展变量并保留字符串的其余部分。因此表达式 "$mylist[0]" 变成 "abc def[0]".

基本上你有三个选项来处理这个限制:

当然还有更多的"exotic"方法,比如使用-join运算符:

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

或替换操作:

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

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