Powershell 为什么在这个例子中我需要子表达式操作符?

Powershell 为什么在这个例子中我需要子表达式操作符?,powershell,substitution,Powershell,Substitution,教科书上的例子是 trap {"trapped : $($error[0])"; break} 在PowerShell中。为什么需要子表达式运算符$()?作为一个初学者,我会明白 trap {"trapped : $error[0]"; break} PowerShell在字符串中使用双引号进行变量替换就足够了 当然,后者不起作用。为什么?变量替换只在变量名:$error结束时才开始 需要表达式替换才能访问此变量的第0个元素,这就是为什么在可扩展字符串

教科书上的例子是

trap {"trapped : $($error[0])"; break}
在PowerShell中。为什么需要子表达式运算符
$()
?作为一个初学者,我会明白

trap {"trapped : $error[0]"; break}
PowerShell在字符串中使用双引号进行变量替换就足够了

当然,后者不起作用。为什么?

变量替换只在变量名:$error结束时才开始


需要表达式替换才能访问此变量的第0个元素,这就是为什么在可扩展字符串(带有外部双引号的字符串或已转换为字符串的字符串)的内部有一个周围的
$()
),变量名被替换为其值。此过程忽略索引(
$var[0]
)和成员访问(
$var.property
),因为变量名[1]中不允许使用
[

双引号字符串确实计算表达式,但必须告诉解析器表达式包含哪些内容。请输入子表达式运算符
$()
()
中的代码被视为表达式。现在可以识别、计算表达式,并将其结果插入字符串中

$var = [pscustomobject]@{prop = 'value'}
"$($var.prop)" # outputs value
value
有关更多信息,请参阅



[1] :变量名中可以使用特殊字符。这在语法
${variableName}
的情况下是允许的。此特殊语法在双引号字符串中被正确替换。

解析规则。让
$x
成为
“香蕉”
,然后
“$x[0]”
成为
“香蕉[0]
”,而不是
$x
的第一个元素,如果它恰好包含数组。变量替换不是表达式替换。我认为这是一个答案,而不仅仅是一个注释。我看到了你聪明的一击,并对此表示感谢,尽管这还不足以将你的想法变成现实。如果你愿意,请自己动手。我做了,如果你愿意,请投赞成票去吧。
$var = [pscustomobject]@{prop = 'value'}
"$($var.prop)" # outputs value
value