単一のバッククォートで二重引用符を使用しました。これは正しくない組み合わせです。実際、どのような場合でも単一のバッククォートだけで十分かどうかはわかりません。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>
[成功]エスケープとして単純なバックスラッシュを含むコンテナとしての一重引用符:
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>