Цель: найти строку в файле server.config и заменить ее другим значением с помощью powershell
Строка, которую я пытаюсь найти в этом файле:
<add key = "ReportServerUrl" value = "http://ADEVSQL14\SQL2016_INS1/ReportServer"></add>
Заменяемая строка:
<add key = "ReportServerUrl" value = "http://ADEVSQL14/SQL2016_INS1/ReportServer"></add>
Что я пробовал:
$filename = Get-Content "C:\target\Server.Config"
$filename -replace "<add key = "ReportServerUrl" value = "http://ADEVSQL14\SQL2016_INS1/ReportServer"></add>", "<add key = "ReportServerUrl" value = "http://ADEVSQL14/SQL2016_INS1/ReportServer"></add>"
Ошибка, которую я получаю:
... "<add key = "ReportServerUrl" value = "http://ADEVSQL14\SQL2016_INS1/Rep
Unexpected token 'ReportServerUrl" value = "http://ADEVSQL14\SQL2016_INS1/ReportServer"></add>"' in expression o statement.
Дополнительные входные данные: хотя я хочу использовать эту функцию как часть шага powershell в конвейере Azure devops, я пробую ее в командной строке, получая аналогичную ошибку.
Может кто подскажет пожалуйста.
Обновление1:
Попробовал ниже в командной строке, он успешно выполняется, но не заменяется.
$filename = Get-Content "C:\target\Server.config" -Raw
$filename -replace '"http://ADEVSQL14\SQL2016_INS1/ReportServer"','"http://ADEVSQL14/SQL2016_INS1/ReportServer"'|Set-Content -Path C:\target\Server.config;
Из документов:
<input> -replace <regular-expression>, <substitute>
Это означает, что вы не можете искать литеральную строку, содержащую символы, имеющие особое значение в регулярном выражении, например обратную косую черту. Такие символы необходимо экранировать, вставляя перед ними обратную косую черту.
Попробуй это:
$filename -replace '"http://ADEVSQL14\\SQL2016_INS1/ReportServer"','"http://ADEVSQL14/SQL2016_INS1/ReportServer"'
Вы также можете использовать метод Regex.Escape() для автоматического экранирования всех специальных символов:
$searchStr = '"http://ADEVSQL14\SQL2016_INS1/ReportServer"'
$searchStrEscaped = [Regex]::Escape( $searchStr )
$filename -replace $searchStrEscaped, '"http://ADEVSQL14/SQL2016_INS1/ReportServer"'
Спасибо @zett42 .. этот управляющий символ \ делает свое дело
Лучше использовать #{Tokens}#
в качестве значений в исходном коде, а затем использовать шаг replacetokens
во время конвейера.
Не рекомендуется заглядывать и/или втыкать непосредственно в сериализованную (xml) строку (это может даже открыть дыру в безопасности). Вместо этого используйте соответствующие парсеры. См. также: Регулярное выражение Powershell для замены текста между двумя строками