PowerShell: горе, регулярное выражение и ($) знак доллара - PullRequest
4 голосов
/ 22 февраля 2012

Я нахожусь в процессе преобразования тысяч строк пакетного кода в 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

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

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

$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
0 голосов
/ 22 февраля 2012

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

 $replacedString = $origString -replace "(IF /I `"%)(.+)(:.+%`"==`")(.+`")(.+)","if ( $`$`$2 -match `"^`$4 ) {`$5 }"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...