2016-05-31 3 views
1

Я пытаюсь создать сценарий 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. переменная.

Большое спасибо за глядя на это :)

UPDATE 1

Это RegEx я планирую использовать: /#{(.+)}/g

+0

Что вы имеете в виду? петля над каждым параметром? –

+0

@jisaak: Правильно, 1. Извлеките все строки, которые заключены в '# {' и '}' ..., а затем замените их на соответствующую переменную ENV. – Moon

+0

ОК, ребята, прежде чем вы начнете голосовать, чтобы закрыть вопрос, пожалуйста, спросите меня, есть ли у вас трудности с пониманием вопроса! Я думаю, что это правильный вопрос. По крайней мере, это действительная проблема, которую я пытаюсь решить на работе. Я уверен, что кто-то, где-то также принесет пользу - особенно когда дело доходит до конфигурационных изменений файла в автоматическом процессе сборки/развертывания. – Moon

ответ

2

Просто загрузите файл с помощью Get-Content Командлет , перебирать по каждому Parmeter, фильтровать все параметры, которые Value начинается с # с использованием Where-Object и изменять значение. Наконец, используйте командлет Set-Content записать его обратно:

$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).

+0

Спасибо. Я даю ему попробовать. – Moon

+1

Я предполагаю, что вместо '^ #' регулярного выражения вы можете использовать '.StartsWith ('#')' –

+1

Да, но для этого потребуется использовать фигурные скобки и '$ _.Value'. Но все равно будет более читабельным - согласен. Другой: 'Где {$ _. Значение [0] -eq '#'}'. ;-) –

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) 
Смежные вопросы