使用PowerShell在文件中用环境变量替换字符串

时间:2018-10-05 21:15:40

标签: powershell

我有一个看起来像这样的文件:

<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" />

但是,我似乎无法将两者结合起来。我认为这与功能解析的顺序有关。

1 个答案:

答案 0 :(得分:1)

尝试使用$Matches自动变量。

(Get-Content .\Cloud.xml) | 
    ForEach-Object { 
        if ($_ -match "\$\{((\w+))\}")
        {
            $_ -replace "\$\{(\w+)\}",$([Environment]::GetEnvironmentVariable($Matches[1]))
        }
        else
        {
            $_
        }
    }