在字符串替换中使用变量-Windows Powershell

时间:2018-12-13 10:37:34

标签: powershell tfs2017 powershell-v5.1

我的字符串格式如下:

<?define BuildNumber = "8314" ?>

我正在TFS 2017构建模板中使用以下powershell脚本替换内部版本号值:

$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 :(得分:2)

使用花括号“转义”组号

$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 ,完全合法。