Не используйте [regex]::Escape()
для экранирования строки замена в операции -replace
- это не регулярное выражение, и \
не имеет особого значения внутри него.
Вместо этого вручную экранирует $
символов. как $$
, потому что $
имеет особое значение в операнде замены, а именно для ссылки на результаты операции сопоставления, в частности результаты группы захвата, как подробно описано в this ответить .
Выполнение этого руководства с экранированием -replace
несколько сложно, потому что $
является особенным как в регулярном выражении, так и в операнде замены, с различными требованиями экранирования:
# Escape a string for use as the replacementt string
# for another -replace call:
<string> -replace '\$', '$$$$' # replace literal '$' with literal '$$'
Следовательно, в этом случае может быть проще использовать строковый литерал .Replace()
метод :
<string>.Replace('$', '$$') # replace literal '$' with literal '$$'
Вот пример туда и обратно:
$str = 'c:\program files\a-name-with-$-in-it'
# Perform substitution and output.
($new = '[DFILEPATH]' -replace 'DFILEPATH', $str.Replace('$', '$$'))
# Perform the inverse replacement.
$new -replace [regex]::Escape($str), 'DFILEPATH'
Выше приведено следующее, доказывающее, что подстановка работала как задумано:
[c:\program files\a-name-with-$-in-it]
[DFILEPATH]