Наличие специальной переменной PowerShell $ _ в строке замены вызывает странное поведение; Мне интересно, есть ли что-то в побеге, которого мне не хватает, или это просто дефект.
Вывод этого кода ...
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $_ text'
$newText
$text -replace "WORD3",$newText
... это где $ _ по какой-то причине интерполируется с исходным содержимым $ text в течение операция замены:
new $_ text
WORD1 WORD2 new WORD1 WORD2 WORD3 WORD4 text WORD4
Заменить должен обрабатывать его второй параметр как литерал - без интерполяции - что верно почти для всего, включая вещи, которые выглядят как обычные переменные, например:
$foo = "HELLO"
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $foo text'
$newText
$text -replace "WORD3",$newText
... и его вывод:
new $foo text
WORD1 WORD2 new $foo text WORD4
Но наличие $ _ вызывает интерполяцию. Аналогичная проблема с $$. Насколько я могу судить, никакие другие специальные переменные не вызывают интерполяции.
Обратите внимание, что та же проблема возникает со встроенным кодом, например:
$text -replace "WORD3",'new $_ text'
Я разделил его выше, чтобы показать, что строка замены была правильной до операции замены. Любопытно, что если я заменю здесь одинарные кавычки двойными кавычками, просить для интерполяции результат другой. То есть этот код:
$text -replace "WORD3","new $_ text"
производит ожидаемый
WORD1 WORD2 new text WORD4
не сбивает с толку
WORD1 WORD2 new $foo text WORD4
Как вы, вероятно, уже знаете, это механизм регулярных выражений, имеющий конфликтующий синтаксис для групп захвата. Это не интерполяция строк PowerShell. Вы можете избежать этого с $$
$text = "WORD1 WORD2 WORD3 WORD4"
$newText = 'new $$_ text'
$newText
$text -replace "WORD3", $newText
"WORD1 WORD2 new $_ text WORD4"
Я мог делать то, что ты хочешь, используя
$text.replace('WORD3','new $_ text')
это дает ожидаемый результат
WORD1 WORD2 new $_ text WORD4