我有一个看起来像这样的文件:
<Parameter Name="WebImage" Value="web:${BuildNumber}" />
<Parameter Name="ApiImage" Value="api:${BuildNumber}" />
我想用环境变量${xxx}
替换文件中出现的xxx
。该文件可以引用任何数量的环境变量。他们不会提前知道。
我正在尝试类似的事情:
(Get-Content .\Cloud.xml) -replace "\$\{(\w+)\}", "$([Environment]::GetEnvironmentVariable('$1'))"
但是,我得到:
<Parameter Name="WebImage" Value="web:" />
<Parameter Name="ApiImage" Value="api:" />
GetEnvironmentVariable
通话可以正常进行,因为我可以这样做:
(Get-Content .\Cloud.xml) -replace "\$\{(\w+)\}", "$([Environment]::GetEnvironmentVariable('BuildNumber'))"
那行得通。由于可以执行$1
呼叫,所以可以正常工作:
(Get-Content .\Cloud.xml) -replace "\$\{(\w+)\}", '$1'
我会得到:
<Parameter Name="WebImage" Value="web:BuildNumber" />
<Parameter Name="ApiImage" Value="api:BuildNumber" />
但是,我似乎无法将两者结合起来。我认为这与功能解析的顺序有关。
答案 0 :(得分:1)
尝试使用$Matches
自动变量。
(Get-Content .\Cloud.xml) |
ForEach-Object {
if ($_ -match "\$\{((\w+))\}")
{
$_ -replace "\$\{(\w+)\}",$([Environment]::GetEnvironmentVariable($Matches[1]))
}
else
{
$_
}
}