$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
# 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
# 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.
3条答案
按热度按时间3phpmpom1#
tl;dr
"..."
内部:***
$(...)
**只需要嵌入整个 * 表达式 * 或 * 命令 *(例如"$($PSVersionTable.PSVersion)"
)***
${...}
**仅在对具有常规名称的变量的独立引用需要 * 定界 * 时才需要(消除歧义),这样字符串中的 * 后续字符 * 就不会被解释为变量名的一部分(例如,"${foo}_bar"
正确地嵌入了变量$foo
;如果没有{...}
,PowerShell将查找变量$foo_bar
;值得注意的是,子序列:
也需要这种技术:"${foo}:bar"
)除了在
"..."
中使用之外,${...}
还需要用于包含 * 特殊字符 * 的变量名(例如${a-b} = 42
)有关PowerShell的 * 可扩展字符串 *(字符串插值)的全面概述,请参阅this answer。
背景信息:
补充marsze's helpful answer:
${...}
(将变量名包含在{
和}
中)确实是 * 总是 * 必要的,如果变量名包含 * 特殊字符 *,例如空格,.
或-
。_
和-surprisingly and problematically-?
。:
**总是 * 被解释为终止PowerShell * 驱动器引用 *(在namespace variable notation的上下文中)或 * 范围说明符 *,而不管是否使用或需要{...}
shell (例如,在$env:USERNAME
或${env:USERNAME}
中,env
指的是代表所有环境变量的Env:
PowerShell drive;在$script:foo
或${script:foo}
中,script
指的是脚本的作用域及其变量)。注意事项:
${...}
-消除变量 name 歧义的语法-**不要与$(...)
混淆,$(...)
是子表达式 * 运算符 *,需要将任何表达式或命令嵌入"..."
(可扩展(插值)字符串)中的独立变量引用。"$var"
/"${var}"
可以正常工作,但"$var.someProperty"
/"${var}.someProperty"
不可以 *:您需要"$($var.someProperty)"
/"$(${var}.someProperty)"
在
"..."
的上下文中,有 * 另一个 * 理由使用${...}
,即使变量名本身不需要它:如果您需要来描述变量名与后面的非空格字符,特别是包括
:
:字符串
有关PowerShell字符串扩展规则的全面概述,请参阅this answer。
请注意,当字符串扩展 * 隐式 * 应用时,在将 * 未加引号的参数 * 传递给命令的上下文中,您需要使用相同的技术;例如:
型
最后,一个有点模糊的替代方案是```-转义变量名后的第一个字符,但问题是这只适用于不属于 * 转义序列 * 的字符(参见
about_Special_Characters
):型
mbskvtky2#
请注意,
$()
对json对象很有帮助:字符串
1yjd4xko3#
${variable}
是包含特殊字符的变量名的语法。(See about_Variables ->包含特殊字符的变量名)
范例:
字符串
因此,在您的情况下,它基本上与简单地写入
$variable
相同