PowerShell字符串插值语法

waxmsbnn  于 2023-11-18  发布在  Shell
关注(0)|答案(3)|浏览(140)

我总是使用以下语法来确保变量在字符串中扩展:
第一个月
我最近遇到了以下语法:
"my string with a ${variable}"
它们是等价的吗?有区别吗?

3phpmpom

3phpmpom1#

tl;dr

"..."内部:

***$(...)**只需要嵌入整个 * 表达式 * 或 * 命令 *(例如"$($PSVersionTable.PSVersion)"
***${...}**仅在对具有常规名称的变量的独立引用需要 * 定界 * 时才需要(消除歧义),这样字符串中的 * 后续字符 * 就不会被解释为变量名的一部分(例如,"${foo}_bar"正确地嵌入了变量$foo;如果没有{...},PowerShell将查找变量$foo_bar;值得注意的是,子序列:也需要这种技术:"${foo}:bar"

除了在"..."中使用之外,${...}还需要用于包含 * 特殊字符 * 的变量名(例如${a-b} = 42
有关PowerShell的 * 可扩展字符串 *(字符串插值)的全面概述,请参阅this answer

背景信息:

补充marsze's helpful answer

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

  • 有关确切的规则,请参阅概念性“about_Variables”帮助主题的相关部分,包含特殊字符的变量名。
  • 名称中(第一次出现)**:**总是 * 被解释为终止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)"
    "..."的上下文中,有 * 另一个 * 理由使用${...},即使变量名本身不需要它:

如果您需要来描述变量名与后面的非空格字符,特别是包括:

$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

字符串
有关PowerShell字符串扩展规则的全面概述,请参阅this answer
请注意,当字符串扩展 * 隐式 * 应用时,在将 * 未加引号的参数 * 传递给命令的上下文中,您需要使用相同的技术;例如:

# 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


最后,一个有点模糊的替代方案是```-转义变量名后的第一个字符,但问题是这只适用于不属于 * 转义序列 * 的字符(参见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.

mbskvtky

mbskvtky2#

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

"My json property is $($jsonObj.property)"

字符串

1yjd4xko

1yjd4xko3#

${variable}是包含特殊字符的变量名的语法。
(See about_Variables ->包含特殊字符的变量名)
范例:

${var with spaces} = "value"
"var with spaces: ${var with spaces}"

字符串
因此,在您的情况下,它基本上与简单地写入$variable相同

相关问题