如何扩展(插入)字符串中的数组元素
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]"
.
基本上你有三个选项来处理这个限制:
使用一个subexpression:
"-$($mylist[0])-"
-
"-{0}-" -f $mylist[0]
使用字符串连接:
"-" + $mylist[0] + "-"
当然还有更多的"exotic"方法,比如使用-join
运算符:
"-", $mylist[0], "-" -join ""
或替换操作:
'-%x%-' -replace '%x%', $mylist[0]
'-%x%-'.Replace('%x%', $mylist[0])
但那些已经接近混淆的边缘。
这对某人来说肯定是随和的。当我在字符串中引用数组项时,它没有产生所需的结果。我希望最后一条语句产生一个包含 "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]"
.
基本上你有三个选项来处理这个限制:
使用一个subexpression:
"-$($mylist[0])-"
-
"-{0}-" -f $mylist[0]
使用字符串连接:
"-" + $mylist[0] + "-"
当然还有更多的"exotic"方法,比如使用-join
运算符:
"-", $mylist[0], "-" -join ""
或替换操作:
'-%x%-' -replace '%x%', $mylist[0]
'-%x%-'.Replace('%x%', $mylist[0])
但那些已经接近混淆的边缘。