Используйте переменные в строке замены - 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, что полностью допустимо.