我正在尝试在Jenkins构建过程中执行以下Powershell脚本:
Write-Host ==================================================
Write-Host Setting Version to $env:Version BEGIN
(Get-Content .\MyFile.js) -replace '"Version"\s*:\s*".*"', '"Version" : "$env:Version"' | Out-File .\MyFile.js
Write-Host Setting Version to $env:Version COMPLETE
Write-Host ==================================================
$ env:Version的第一个和最后一个实例正确替换。我看到了输出
==================================================
Setting Version to 1.2.3.4 BEGIN
Setting Version to 1.2.3.4 COMPLETE
==================================================
但$ env:Version的第二个实例在MyFile.js中没有被替换。当我打开MyFile.js时,我看到以下内容:
"Version" : "$env:Version",
如何将此环境变量传递给Get-Content命令?它是关于正则表达式(由-replace触发)阻止替换发生的吗?
答案 0 :(得分:3)
你有一个单引号的字符串,不允许变量扩展。
'"Version" : "$env:Version"'
可能是这样。我们使用反引号来逃避引号,因此解释器不会吃掉它们。也可能需要一个子表达式。
"`"Version`" : `"$($env:Version)`""
或根据Etan Reisner的解决方案
('"Version" : "{0}"' -f $env:version)
我甚至可以改进-replace
以及使其更清洁。使用捕获组来保存字符串的第一部分,如$1
,因为它将保持不变。使用格式运算符在$env:version
中添加,因此我们不需要子表达式。
-replace '("Version"\s*:\s*)".*"',('$1"{0}"' -f $env:version)