Используйте переменные в строке замены - Windows powershell

У меня есть требование, где моя строка имеет формат, как показано ниже:

<?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 ответ

Решение

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

$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, что полностью допустимо.

Другие вопросы по тегам