Назад | Перейти на главную страницу

Оператор PowerShell -replace демонстрирует причудливое поведение с определенными данными

Наличие специальной переменной 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