Regex PowerShell管柱更换

Regex PowerShell管柱更换,regex,powershell,Regex,Powershell,我正在尝试构建一个PowerShell脚本,这样我就给它一个输入文件和regex,它用环境变量替换匹配的内容 比如说, 如果输入文件包含以下内容: <?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:/Se

我正在尝试构建一个PowerShell脚本,这样我就给它一个输入文件和regex,它用环境变量替换匹配的内容

比如说,

如果输入文件包含以下内容:

<?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\u MGR\u IC
环境变量的值替换
{INT\u MGR\u IC}

如果你知道这样的剧本,或者能为我指出正确的方向,那将是一个很大的帮助。具体而言,我想知道如何:

  • 从文件中提取和循环密钥,例如:
    {INT\u MGR\u IC}
    {EVT\u MGR\u IC}
    ,等等
  • 一旦我有了密钥,我如何用关联的环境变量替换它。例如,
    {INT_MGR_IC}
    INT_MGR_IC
    env。变数
  • 非常感谢您对此进行调查:)

    更新1


    这是我计划使用的正则表达式:
    /{(+)}/g

    只需使用cmdlet加载文件,迭代每个
    参数
    ,使用筛选所有以
    开头的
    参数并更改值。最后,使用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($\u.Value)

    非常感谢所有帮助您的人。特别是,
    @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)
    

    你是什么意思?在每个参数上循环?@jisaak:正确,1。提取包含在
    #{
    }
    中的所有字符串。。。然后用相关的ENV变量替换它们。好了,伙计们,在你们开始投票结束这个问题之前,请问我你们是否在理解这个问题上有困难!我认为这是一个合理的问题。至少,这是我在工作中试图解决的有效问题。我相信在某个地方也会有人受益——特别是在自动构建/部署过程中的配置文件转换方面。但不使用正则表达式,请阅读原因:@jisaak:非常感谢您的快速响应和链接。我正在经历它。谢谢你。我正在尝试一下。我想你可以使用
    .StartsWith(“#”)
    来代替
    ^
    正则表达式,但是它需要使用大括号和
    $.Value
    符号。但还是更具可读性——我同意。另一个:
    其中{$\.Value[0]-eq'#'}
    ;-)