PowerShell字符串替换

时间:2016-05-31 19:15:45

标签: regex powershell

我正在尝试构建一个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环境变量的值,依此类推。

如果你知道这样的剧本或者能指出我正确的方向,那将是一个很大的帮助。具体来说,我有兴趣知道如何:

  1. 从文件中提取并循环键,例如:#{INT_MGR_IC}#{EVT_MGR_IC}等。
  2. 获得密钥后,如何将其替换为关联的环境变量。例如,#{INT_MGR_IC}带有INT_MGR_IC env。变量
  3. 非常感谢您对此进行调查:)

    更新1

    这是我打算使用的RegEx:/#{(.+)}/g

2 个答案:

答案 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)