for ($i=1; $i -lt 3; $i++){
$tT=$i
$ExecutionContext.InvokeCommand.ExpandString($o0)
echo $o0
echo $tT
}
$o0="weird${tT}";
输出:怪异2怪异21.怪异2怪异22
为什么?我希望
怪异1怪异11.怪异2怪异22
我怎样才能让事情正常运转?
代码的附带问题是,您正在定义字符串模板,$o0
,仅在您尝试使用它之后。
-
ISE的不幸行为掩盖了这个问题,即有效地点源脚本调用。即在重复调用期间在相同的范围内执行它们,这可能会产生副作用。
-
顺便说一句:PowerShell ISE不再积极开发,有理由不使用它(底部(,尤其是无法运行PowerShell(Core(6+。积极开发的跨平台编辑器提供了最好的PowerShell开发体验,它是带有PowerShell扩展的Visual Studio Code。
代码中的概念性问题是您错误地使用可扩展(双引号(字符串("..."
(来定义字符串模板,这导致即时扩展(插值(。
使用$ExecutionContext.InvokeCommand.ExpandString()
的目的是向它传递一个带有未扩展的变量引用或子表达式的字符串值,以便根据需要扩展它们,然后使用当前的变量值和表达式结果。
要创建这样一个未展开的字符串值,需要一个逐字逐句(单引号(的字符串('...'
(。
因此,您的代码应该是:
# Define the string template
# *as a verbatim string*, i.e. *single-quoted*
$o0='weird${tT}'
for ($i=1; $i -lt 3; $i++) {
# (Re)define $tT
$tT=$i
# Use on-demand expansion of the value of $o0,
# which uses the current value of $tT
$ExecutionContext.InvokeCommand.ExpandString($o0)
}
输出:
weird1
weird2
当前循环不会更改$o0
的内容。如果你在一个干净的PS会话中执行你的代码,它只会输出空行,后面跟着一行和两行。因为只有$tT
具有值。
您需要在循环中包含$o0
,以便在运行时实际打印它。
for ($i=1; $i -lt 3; $i++){
$tT=$i
$o0="weird${tT}";
echo $o0
echo $tT
}
$ExecutionContext.InvokeCommand.ExpandString($o0)
对于您目前拥有的内容并没有那么有用。
实际上我被Powershell ISE欺骗了。显然";运行脚本"不清楚之前的上下文,这就是为什么输出可能非常误导的原因。上述脚本的正确输出实际上不包含";怪异2";但只有";1〃;以及";2〃;正如赛斯所指出的。