归因:
以下答案复制自 Tomas Restrepo 的博客https://winterdom.com/2008/02/20/watchoutforinpowershell
这是前几天我在 Windows PowerShell 脚本中遇到的问题。假设您有变量 $user 和 $machine,并且想要打印一个字符串,它们的值用冒号 (':') 分隔。
你显然可以使用字符串连接来做到这一点:
$user = 'tomasr'
$machine = 'arcano'
write ($user + ':' + $machine)
这行得通,但 PowerShell 不支持那个不错的字符串插值功能吗?为什么,是的!那么我们为什么不直接重写它:
write "$user:$machine"
但是等等!如果你运行最后一行,你得到的只是 $machine 变量的值...... $user 去哪儿了?
答案是冒号在 PowerShell 变量名称中具有特殊含义:它用于将变量与特定范围或命名空间相关联。 PowerShell定义了一些范围,例如脚本和全局;例如,一个全局变量可能被命名为 $global:var。
但是我们不是在其他地方也看到过这种语法吗?当然,$env:PATH 怎么样?一样;除了这里 env 本身不是一个范围,而是一个 PSDrive。所以':'之前的部分可以是由 PS 或 PSDrive 定义的实际范围。哎呀,您甚至可以尝试“${c:autoexec.bat}”之类的方法,然后观看魔术发生!
所以我们的字符串插值的问题是,当 PowerShell 看到 "$user:$machine" 时,它希望找到一个名为“user”的作用域/psdrive,并希望在“:”之后有一个变量名,但“$”不是有效,并且“用户”也不是范围或 PSDrive,这让 PowerShell 有点困惑。但由于他太绅士了,他只是尽可能地把它修好,忽略了到目前为止的一切,只是毫无怨言地转储 $machine。他很好,但如果你没想到的话,它真的会让你大吃一惊!
我们可以避免这种情况吗?是的,我们可以通过使用“{}”为 PowerShell 准确地分隔变量名称,如下所示:
write "${user}:$machine"
Bruce Payette 出色的 Windows PowerShell in Action 第 141 页的第 5.8 节介绍了 PowerShell 中的变量主题,并为我提供了解决此问题的线索。