PowerShell: проблемы с -replace, regex и ($) со знаком доллара

Я нахожусь в процессе преобразования тысяч строк пакетного кода в PowerShell. Я использую регулярное выражение, чтобы помочь с этим процессом. Проблема в том, что часть кода:

$`$2

При замене он просто показывает $2 и не расширяет переменную. Я также использовал одинарные кавычки для второй части замены вместо экранирования переменных, тот же результат.

$origString = @'
IF /I "%OPERATINGSYSTEM:~0,6%"=="WIN864" SET CACHE_OS=WIN864
...many more lines of batch code
'@

$replacedString = $origString -replace "(IF /I `"%)(.+)(:.+%`"==`")(.+`")(.+)","if ( $`$2 -match `"^`$4 ) {`$5 }"

$replacedString

person Vippy    schedule 22.02.2012    source источник
comment
Просто для полноты всякий раз, когда вы публикуете вопрос о манипуляции со строками, всем было бы полезно, если бы вы могли привести пример текста до манипуляции (который у вас есть) и как должна выглядеть строка после манипуляции .   -  person EBGreen    schedule 22.02.2012
comment
Хорошая идея. Сделаю в следующий раз. Спасибо.   -  person Vippy    schedule 23.02.2012


Ответы (2)


Вы можете попробовать что-то вроде этого:

$origString -replace "(IF /I `"%)(.+)(:.+%`"==`")(.+`")(.+)",'if ($$$2 -match "^$4" ) {$5 }'

Обратите внимание на $$$2. Это оценивается как $ и содержимое $2.


Некоторый код, чтобы показать вам различия. Попробуй сам:

'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"  # "$1" is expanded before replace to ''
'abc' -replace 'a(\w)', '$$$1'
'abc' -replace 'a(\w)', "$$$1" #variable $$ and $1 is expanded before regex replace
                               #$$ and $1 don't exist, so they are expanded to ''

$$ = 'xyz'
$1 = '123'
'abc' -replace 'a(\w)', "$$$1`$1" #"$$$1" is expanded to 'xyz123', but `$1 is used in regex
person stej    schedule 22.02.2012
comment
Я оценивал и пытался понять ваши примеры, и я не понимаю, почему ЭТО: «abc» - заменить «a (\ w)», «$ 1» И ЭТО: «abc» - заменить «a (\ w)», 1 доллар отличается? - person Vippy; 23.02.2012
comment
Это потому, что '$1' и "$1" (после того, как вы нажмете Enter или запустите скрипт) сначала анализируются PowerShell. '$1' и "$1" преобразуются в строки в соответствии с некоторыми правилами (см., например, computerperformance.co.uk /powershell/powershell_quotes.htm и blogs.msdn.com/b/powershell/archive/2006/07/15/ ). И после этого выполняется оператор -replace. Так работает интерпретатор. - person stej; 23.02.2012

попробуйте так:

 $replacedString = $origString -replace "(IF /I `"%)(.+)(:.+%`"==`")(.+`")(.+)","if ( $`$`$2 -match `"^`$4 ) {`$5 }"
person CB.    schedule 22.02.2012