【问题标题】:PowerShell string replacementPowerShell 字符串替换
【发布时间】:2016-06-02 00:55:56
【问题描述】:

我正在尝试构建一个 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 环境。变量。

非常感谢您对此进行调查 :)

更新 1

这是我打算使用的正则表达式:/#{(.+)}/g

【问题讨论】:

  • 你的意思是循环键?循环遍历每个参数?
  • @jisaak:正确,1. 提取#{} ... 中包含的所有字符串,然后将它们替换为关联的ENV 变量。
  • 好的伙计们,在你开始投票结束这个问题之前,如果你在理解这个问题上有困难,请问我!我认为这是一个有效的问题。至少,这是我在工作中试图解决的有效问题。我相信某个地方的某个人也会受益——尤其是在自动构建/部署过程中的配置文件转换方面。
  • 好的,我会尽力为您提供脚本。但不使用正则表达式,请阅读原因:stackoverflow.com/a/1732454/1163423
  • @jisaak:非常感谢您的快速回复和链接。我正在经历它。欣赏它:)

标签: regex powershell


【解决方案1】:

只需使用Get-Content cmdlet 加载文件,遍历每个Parmeter,过滤所有Value# 开头的参数,使用Where-Object 并更改值。最后,使用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)

【讨论】:

  • 谢谢。我正在试一试。
  • 我猜你可以使用.StartsWith('#')而不是^#正则表达式
  • 是的,但它需要使用大括号和$_.Value 表示法。但仍然会更具可读性 - 我同意。另一个:Where { $_.Value[0] -eq '#' }。 ;-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2014-09-20
    • 2017-07-02
    • 2013-02-01
    • 2013-08-07
    • 2017-10-27
    相关资源
    最近更新 更多