2016-05-31 18 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}を置き換え、スクリプトを構築したいと思います。

このようなスクリプトを知っているか、正しい方向に向けることができれば、大きな助けになります。具体的には、私が知って興味を持ってどのように:私は鍵を持っていたら#{INT_MGR_IC}#{EVT_MGR_IC}など

  • 、どのように私は関連してそれを置き換えるか次のようなファイルからのキーの上に

    1. エキスとループ環境変数。例えば、#{INT_MGR_IC}INT_MGR_ICのenv。変数。

    この覗くためのたくさんありがとう:)

    UPDATE 1

    これは私が使用することを予定しております正規表現です:/#{(.+)}/g

  • +0

    ループオーバーキーとは何ですか?各パラメータをループしますか? –

    +0

    @jisaak:正しい。1. '#{'と '}' ...で囲まれたすべての文字列を抽出し、関連するENV変数に置き換えます。 – Moon

    +0

    質問を閉じる前に投票を開始する前に、問題を理解するのが難しいかどうか質問してください。私はこれが有効な質問だと思う。少なくとも、これは私が仕事で解決しようとしている有効な問題です。特に、自動化されたビルド/デプロイメントプロセスで設定ファイルの変換が行われる場合は、誰かが利益を得ると確信しています。 – Moon

    答えて

    2

    ちょうどGet-Contentコマンドレットを使用してファイルを読み込みますそれぞれのを繰り返し、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)