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