您使用了双引号和一个反引号。这是不正确的组合。事实上,我不确定在 any 情况下单独一个反引号就足够了。在 PowerShell 中转义美元符号 ($) 的成功选项是使用带有反斜杠-反引号组合的双引号 ("\`$find"),或者使用带有简单反斜杠的单引号('\$find')。 [但是,请注意最后关于函数调用参数的异常。] 请参阅下面的示例。
此外,对于那些不熟悉区别的人,重要的是不要将 反引号 字符 (`) 与 单引号 混淆这些转义中的字符 (')。
[SUCCESS] 双引号作为容器,反斜杠-反引号作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 双引号作为容器,反斜杠撇号作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"}
What is $old?
PS C:\Temp>
[SUCCESS] 单引号作为容器,用简单的反斜杠作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 单引号作为容器,反斜杠-反引号作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"}
What is $old?
PS C:\Temp>
总的来说,最简单的选择可能是使用单引号作为容器,使用单反斜杠作为转义:'\$old'
更新:好像上面的内容还不够混乱,当您使用函数调用而不是命令时,需要单引号没有转义。尝试在函数调用参数上使用转义将不起作用:
[FAIL]在函数参数中使用转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_.ToString().Replace('\$old', "(New)");}
What is $old?
PS C:\Temp>
[SUCCESS]在函数参数中使用没有转义的纯单引号:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_.ToString().Replace('$old', "(New)");}
What is (New)?
PS C:\Temp>