Используйте переменные в строковой замене - Windows powershell - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть требование, когда моя строка имеет следующий формат:

<?define BuildNumber = "8314" ?>

Я использую приведенный ниже скрипт powershell в шаблоне сборки TFS 2017 для замены значения номера сборки:

$content = Get-Content -path "$(Build.SourcesDirectory)\Install\Common\Constants.wxi"
$num  = $(Build.BuildId)
$content -Replace '(BuildNumber\s*=\s*")\d*("\s*)', "`$1 $num `$2" |  Out-File $(Build.SourcesDirectory)\Install\Common\Constants.wxi

Это дает вывод как <?define BuildNumber = " 27994 " ?>, что неверно, так как я не хочу пробелов в значении.Когда я попытался использовать приведенный ниже код, он не работает.

$content -Replace '(BuildNumber\s*=\s*")\d*("\s*)', "`$1$num`$2" |  Out-File  $(Build.SourcesDirectory)\Install\Common\Constants.wxi

Вывод: <?define $27994 ?>

Я перепробовал все комбинации, но не могу заставить цитаты работать правильно.Пожалуйста, предложите решение.

1 Ответ

0 голосов
/ 13 декабря 2018

Используйте фигурные скобки, чтобы "экранировать" номер группы

$content -Replace '(BuildNumber\s*=\s*")\d*("\s*)', "`${1}$num`$2" | Out-File $(Build.SourcesDirectory)\Install\Common\Constants.wxi

Небольшое разъяснение о том, почему оригинальный код не работает: после разрешения переменной $ num строка замены стала $ 127994 $ 2..Это означает, что оператор -replace пытается найти группу $ 127994 , которой, очевидно, не существует.Когда мы добавляем фигурные скобки, это становится $ {1} 27994 $ 2 , что вполне законно.

...