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



这对某人来说肯定很容易。当我引用字符串中的数组项时,它不会产生所需的结果。我希望最后一个语句生成一个包含"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])

但这些已经濒临混淆。

最新更新