注意:虽然此答案涵盖了 PowerShell 中字符串插值的许多方面,但可以在 this answer 中找到对该主题的更全面处理。
在双引号字符串中嵌入变量引用时,只能嵌入简单的变量引用,而不用将表达式括在所谓的子表达式运算符$(...)中:
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
更准确地说,您可以直接嵌入以下变量引用双引号字符串/here-strings 为了让它们扩展(插值):
- 一个仅按名称引用的变量;例如,
"I'm $HOME."
- 带有范围说明符的变量;例如,
"I'm on a spiritual $env:PATH."
要区分变量名与后续字符,将其括在{...}中;例如,
"I'm ${HOME}:"
请注意,如果没有 {...},最终的 : 将被解释为变量名的一部分,并会导致错误。
或者,您可以将: 转义为`:,类似地,使用`$ 转义(创建一个文字)$。
对于其他一切,包括访问数组变量的下标或对象变量的property,您需要子表达式运算符$(...)。
请注意,$(...) 允许您在字符串中嵌入整个命令行;例如:
PS> "Today is $((Get-Date).ToString('d'))."
Today is 10/13/16. # en-US culture
文档说明:Get-Help about_Quoting_Rules 涵盖了字符串插值,但从 PSv5 开始,并不深入。
对于替代字符串插值(扩展)构建字符串,请参阅Ansgar Wiecher's answer。