Передавшая строка содержит знаки доллара в переменной -Заменить - PullRequest
6 голосов
/ 05 февраля 2010

Я пытаюсь заменить предложение в файле .config с помощью powershell.

${c:Web.config} = ${c:Web.config} -replace

'$BASE_PATH $ \ Test \ bin` $ Test_TYPE` $ \ WebTest.dll', 'c: \ program Files \ example \ webtest.dll'

Каждый раз, когда я пытаюсь запустить приведенный выше код, я получаю

"Неверный шаблон регулярного выражения: $ Базовый_путь $ \ Test \ Bin \ $ Test_TYPE $ \ WebTest.dll» в c: \ tests \ runtesting.ps1 -replace <<<< $ Базовый_путь $ \ Test \ Bin \ $ Test_TYPE $ \ WebTest.dll </p>

Если я не использую обратную галочку, знаки доллара исчезнут и появится текст.

Как бы я передал знаки доллара в строке на место?

Ответы [ 4 ]

5 голосов
/ 05 февраля 2010

Это о том, как избежать регулярных выражений . Каждый специальный символ (особенный в отношении регулярных выражений), такой как $, должен быть экранирован с помощью \

'$A$B()[].?etc' -replace '\$|\(|\)|\[|\]|\.|\?','x'
'$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll' -replace '\$BASE_PATH\$\\Test\\bin\$Test_TYPE\$\\WebTest.dll','something'

Обратный знак будет использоваться, когда регулярное выражение будет выглядеть так:

'$A$B' -replace "\`$",'x'
4 голосов
/ 05 февраля 2010

Для прохождения:

$BASE_PATH$\Test\bin\$Test_TYPE$\WebTest.dll

Изменить на:

`"\`$BASE_PATH\`$\\Test\\bin\\\`$Test_TYPE\`$\\WebTest.dll"`

Логика:

  • Перед каждым знаком доллара вводить \ `
  • Перед каждой обратной косой чертой вводите другую обратную косую черту \
  • Закрытие строки двойными кавычками ""
1 голос
/ 28 декабря 2015

Для тех, кто не знаком с этим различием, важно не путать символ backtick (`) с одинарной кавычкой символ ( ') в этих побегах. Например:

[УСПЕХ] Двойные кавычки как контейнер с обратной косой чертой в качестве escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"}
What is (New)?
PS C:\Temp>

[FAIL] Двойные кавычки в качестве контейнера с обратным слешем-апострофом в качестве escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"}
What is $old?
PS C:\Temp>

[УСПЕХ] Одиночные кавычки в виде контейнера с простой обратной косой чертой в качестве escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"}
What is (New)?
PS C:\Temp>

[FAIL] Одинарные кавычки в виде контейнера с обратной косой чертой в качестве escape:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"}
What is $old?
PS C:\Temp>

В целом, самым простым вариантом может быть использование одинарных кавычек в качестве контейнера и одиночной обратной косой черты в качестве escape: '\$old'

1 голос
/ 19 марта 2011

Просто, чтобы предоставить немного больше информации для ответа Stej , здесь происходит две вещи:

1) При синтаксическом анализе команды powershell расширяет переменные в аргументах строки до -replace (например, строка "shell: $ShellId" будет расширять ShellId переменная, производящая shell: Microsoft.PowerShell). Использование экранирующего символа обратного тика или объявление строки одинарными кавычками предотвращает это (и "shell: &#x0060;$ShellId", и 'shell: $ShellId' становятся shell: $ShellId).

2) Оператор -replace использует регулярные выражения .NET , где символы $, \ и . являются элементами специального языка. Использование escape-символа обратной косой черты позволяет использовать специальные символы в качестве литеральных значений в регулярном выражении (например, \$ будет соответствовать символу доллара, а $ будет соответствовать концу строки). Поскольку $ используется и в PowerShell, и в регулярных выражениях, его необходимо экранировать дважды (используя "\&#x0060;$" или '\$').

В этом случае другой альтернативой будет использование метода string.Replace, который будет выполнять замену с учетом регистра:

${c:Web.config}.Replace(
  '$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll',
  'c:\program Files\example\webtest.dll'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...