powershell:未评估内插字符串

powershell: interpolated string is not being evaluated

for ($i=1; $i -lt 3; $i++){
$tT=$i
$ExecutionContext.InvokeCommand.ExpandString($o0)
echo $o0
echo $tT
}

$o0="weird${tT}";

输出: 奇怪2 奇怪2 1个 奇怪2 奇怪2 2

这是为什么?我希望

奇怪1 奇怪的1 1个 奇怪2 奇怪2 2

我怎样才能使事情正常进行?

您当前的循环不会更改 $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骗了。 显然,“运行 脚本”没有清除以前的上下文,这就是为什么输出可能非常具有误导性的原因。 正如 Seth 指出的那样,上述脚本的正确输出实际上不包含“weird2”,而只包含“1”和“2”。

您的代码的附带问题是您正在定义字符串模板 , $o0, 只有 你尝试使用它之后。

  • 这个问题被 ISE 的有效 dot-sourcing 脚本调用的不幸行为掩盖了。即在重复调用期间在同一范围内执行它们,这可能会产生副作用。

  • 顺便说一句:PowerShell ISE 是 no longer actively developed and (bottom section), notably not being able to run PowerShell (Core) 6+. The actively developed, cross-platform editor that offers the best PowerShell development experience is Visual Studio Code with its PowerShell extension

你的代码的概念问题你错误地使用了expandable (double-quoted) string ("...")来定义字符串模板,这会导致即时扩展(插值)。

使用$ExecutionContext.InvokeCommand.ExpandString()的要点是向它传递一个带有未扩展变量引用或子表达式的字符串值,以便根据需要扩展它们,具有 then-current 变量值和表达式结果。

要创建这样一个未扩展的字符串值,您需要 verbatim (single-quoted) string ('...')

因此,您的代码应该是:

# 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