PowerShell 字符串插值语法

fra*_*fra 29 syntax powershell string-interpolation

我总是使用以下语法来确保变量在字符串中展开:

"my string with a $($variable)"

我最近遇到了以下语法:

"my string with a ${variable}"

它们是等价的吗?有什么区别吗?

mkl*_*nt0 46

补充marsze 的有用答案

${...}如果变量名称包含特殊字符(例如空格、 或),(将变量名称括在{和 中})确实总是必要的.-

在 内的字符串扩展(插值)上下文中"...",还有另一个使用 的${...}原因,即使变量名本身不需要它:

如果您需要直接在非空白字符之后描述变量名称,特别是包括:

$foo = 'bar'  # example variable

# INCORRECT: PowerShell assumes that the variable name is 'foobarian', not 'foo'
PS> "A $foobarian."
A .  # Variable $foobarian doesn't exist -> reference expanded to empty string.

# CORRECT: Use {...} to delineate the variable name:
PS> "A ${foo}barian."
A barbarian.

# INCORRECT: PowerShell assumes that 'foo:' is a *namespace* (drive) reference
#            (such as 'env:' in $env:PATH) and FAILS:
PS> "$foo: bar"
Variable reference is not valid. ':' was not followed by a valid variable name character. 
Consider using ${} to delimit the name.

# CORRECT: Use {...} to delineate the variable name:
PS> "${foo}: bar"
bar: bar
Run Code Online (Sandbox Code Playgroud)

有关PowerShell 字符串扩展规则的全面概述,请参阅此答案

请注意,在将不带引号的参数传递给命令的上下文中,隐式应用字符串扩展时您需要相同的技术;例如:

# INCORRECT: The argument is treated as if it were enclosed in "...",
#            so the same rules apply.
Write-Output $foo:/bar

# CORRECT
Write-Output ${foo}:/bar
Run Code Online (Sandbox Code Playgroud)

最后,一个有点晦涩的替代方法是`-escape 变量名后的第一个字符,但问题是这仅适用于不属于转义序列的字符(请参阅参考资料about_Special_Characters):

# OK: because `: is not an escape sequence.
PS> "$foo`: bar"
bar: bar

# NOT OK, because `b is the escape sequence for a backspace character.
PS> "$foo`bar"
baar # The `b "ate" the trailing 'r' of the variable value
     # and only "ar" was the literal part.
Run Code Online (Sandbox Code Playgroud)


der*_*can 27

请注意,这$()对于 json 对象很有帮助:

"My json property is $($jsonObj.property)"
Run Code Online (Sandbox Code Playgroud)

  • 详细说明@Grault的评论:“${var}”中的“{”和“}”是单独引用_variable_上下文中的语法元素,以消除其_name_的歧义。相比之下,“$(...)”是子表达式_operator_。因此,这两种语法形式是彼此独立的,并且在给定情况下可能需要“组合”。对于任何超出独立变量引用的表达式,您都需要在“”...”内添加“$(...)”;例如 `"$var"` / `"${var}"` 工作正常,但是 `"$var.someProperty"` / `"${var}.someProperty"` 不_:你需要 `"$($var .someProperty)"` / `"$(${var}.someProperty)"` (7认同)
  • 这也是我对于普通 PowerShell 表达式所需要的。 (4认同)

mar*_*sze 8

${variable} 是包含特殊字符的变量名称的语法。

(请参阅about_Variables -> 包含特殊字符的变量名称

例子:

${var with spaces} = "value"
"var with spaces: ${var with spaces}"
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,它与简单地写作基本相同 $variable