Powershell для замены подстроки переменной среды, переданной во время выполнения - PullRequest
0 голосов
/ 09 октября 2019

Я получаю входные данные файла конфигурации, и мне нужно заменить определенную строку переменной среды, которую я передаю во время выполнения. Однако результирующая строка точно такая же (без изменений). Я использовал ключевое слово replace.

Я передал строку вместо одинарных кавычек, что означает, что она будет проходить как есть (строка содержит определенные значения в двойных кавычках), а затем ожидаемая строка в двойных кавычках.

$File = Get-Content path of file
if (![string]::IsNullOrWhiteSpace($env:ai_logging_mode)) **this is the env variable**
{
    $file = $file | ForEach-Object { $_ -replace '<logger name="*" minlevel="Trace" writeTo="console" />', "<logger name=`"*`" minlevel=`"$env:ai_logging_mode`" writeTo=`"console`" />"};
}
Set-Content -Path path of the file -Value $file;

значение minlevel не меняется. Я передал значение как Информация. результат должен быть как

<logger name="*" minlevel="Info" writeTo="console" />

Однако результат все еще

<logger name="*" minlevel="Trace" writeTo="console" />

1 Ответ

0 голосов
/ 10 октября 2019

Проблема здесь в том, что вы не избежали метасимволов регулярных выражений.

Оператор Replace выполняет сопоставление с регулярным выражением и замену сопоставленных символов. * - это квантификатор в регулярном выражении, который будет соответствовать нулю или более символов текущего сопоставленного символа (символа перед *). Регулярное выражение будет совпадать с * буквально, если оно получит обратную косую черту, которая станет \*. Вы также можете использовать метод Escape() из класса Regex в вашей строке, который будет автоматически экранировать метасимволы.

$StringToReplace = '<logger name="\*" minlevel="Trace" writeTo="console" />'
$StringReplacement = "<logger name=`"*`" minlevel=`"$env:ai_logging_mode`" writeTo=`"console`" />"
$_ -replace $StringToReplace,$StringReplacement

Чтобы использовать метод класса Regex Escape(), вы можете сделать следующее:

$StringToReplace = [regex]::Escape('<logger name="\*" minlevel="Trace" writeTo="console" />')
$StringReplacement = "<logger name=`"*`" minlevel=`"$env:ai_logging_mode`" writeTo=`"console`" />"
$_ -replace $StringToReplace,$StringReplacement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...