我正在尝试构建一个PowerShell脚本,以便为其提供输入文件和正则表达式,它将匹配的内容替换为环境变量。
例如,
如果输入文件包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/Services" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="IntegrationManager_PartitionCount" Value="1" />
<Parameter Name="IntegrationManager_MinReplicaSetSize" Value="2" />
<Parameter Name="IntegrationManager_TargetReplicaSetSize" Value="#{INT_MGR_IC}" />
<Parameter Name="EventManager_InstanceCount" Value="#{EVT_MGR_IC}" />
<Parameter Name="Entities_InstanceCount" Value="#{ENT_IC}" />
<Parameter Name="Profile_InstanceCount" Value="#{PRF_IC}" />
<Parameter Name="Identity_InstanceCount" Value="#{IDNT_IC}" />
</Parameters>
</Application>
我想构建一个脚本,将#{INT_MGR_IC}
替换为INT_MGR_IC
环境变量的值,依此类推。
如果你知道这样的剧本或者能指出我正确的方向,那将是一个很大的帮助。具体来说,我有兴趣知道如何:
#{INT_MGR_IC}
,#{EVT_MGR_IC}
等。#{INT_MGR_IC}
带有INT_MGR_IC
env。变量非常感谢您对此进行调查:)
更新1
这是我打算使用的RegEx:/#{(.+)}/g
答案 0 :(得分:2)
只需使用Get-Content cmdlet加载文件,迭代每个Parmeter
,使用Where-Object过滤Value
以#
开头的所有参数并更改价值。最后,使用Set-Content cmdlet将其写回:
$contentPath = 'Your_Path_Here'
$content = [xml] (Get-Content $contentPath)
$content.DocumentElement.Parameters.Parameter | Where Value -Match '^#' | ForEach-Object {
$_.Value = "REPLACE HERE"
}
$content | Set-Content $contentPath
如果您需要确定环境变量,可以使用[Environment]::GetEnvironmentVariable($_.Value)
。
答案 1 :(得分:0)
非常感谢所有帮助过的人。特别是,@jisaak
:)
这是我构建的最终脚本,解决了问题中的问题。希望它对某人有用!
$configPath = 'Cloud.xml'
$config = [xml] (Get-Content $configPath)
$config.DocumentElement.Parameters.Parameter | Where {$_.Value.StartsWith("#{")} | ForEach-Object {
$var = $_.Value.replace("#{","").replace("}","")
$val = (get-item env:$var).Value
Write-Host "Replacing $var with $val"
$_.Value = $val
}
$config.Save($configPath)