2017-07-10 3 views
1

インストールされているコンポーネントを自動アップグレードするPowerShellスクリプトの作成に取り組んでいます。ファイルの設定の詳細はXMLファイルに保存されます。変数には相互依存関係があるため、変数は以下のように定義されます。PowerShellを使用したXML変数置換

<root> 
    <variable name="APP_NAME", value="My App" /> 
    <variable name="INSTALL_PATH", value="some folder/${APP_NAME}" /> 
    <variable name="PRODUCT_HOME" value="${INSTALL_PATH}\productinfo\${APP_NAME}" /> 
<root> 

私はsome folder/My Appの代わりsome Folder/${APP-NAME}として$INSTALL_PATHの値を取得したいXMLファイルを読み込みます。数ステップ後にAPP_NAMEの値が変わり、XMLファイルを再度解析する必要があります。

これを行うにはどうすればよいでしょうか?

私は、XMLファイルを読み、XMLファイル内のすべての変数にPowerShell変数を作成することを考えました。私はXMLファイルを再解析する必要があるとき、変数の値を変更します。

これを実現する方法はありますか?

$xml.SelectNodes('//variable') | ForEach-Object { 
    New-Variable -Name $_.name -Value $ExecutionContext.InvokeCommand.ExpandString($_.value) 
} 

は、そうでない場合は、ユーザーが定義する必要があります:<variable>ノードが「イン・オーダー」であれば

+0

あなたは効果的に独自の小さなドメイン言語をXMLで作成しています。これを何らかの形で制限しないと(つまり、定義が任意の順序で表示されることは合法です)、あなたは完全な豚に行き、DAGを構築し、トポロジ的に並べ替える必要があります。これを行わず、定義を順番に許可することを強くお勧めします。この場合、ファイルを行ごとに解析し、すべての行で置き換えられた定義のハッシュを維持することで逃れることができます。 –

+1

もっと怠惰かもしれないが、おそらく効果的な代替案は、コンフィギュレーションがPowerShellオブジェクトであることを要求することです。これは、スクリプトをどこかでドットソーシングすることによって得られます。その利点は、構成を構築する際に人々に完全な柔軟性を与えることです。欠点は、構成を構築する上で人々に完全な柔軟性を持たせることができることです。これは、保守と理解が必要なコードであり、セキュリティに影響を及ぼす可能性があります。 –

+0

最後に重要なのは、(OK、私は答えを書く時間を費やしていたはずです)何らかの形で車輪を再発明していないことを確認してください。 PowerShellには、[Desired State Configuration](https://msdn.microsoft.com/en-us/PowerShell/dsc/overview)の形式でコンポーネントを維持するための(半)ネイティブサポートがあります。それはあなたの目的のために過度の可能性があります、またはそれは自分自身を圧倒する将来的な証明ソリューションかもしれません。 –

答えて

1

は、すなわち、各ノードは、あなたがこのような何かを行うことができ、すでに前の節で定義された変数のみを使用しています最初の変数、および第二段階では、ネストされた変数を展開します。hashtableの代わりに、個々の変数を使用すると、取り扱いがはるかに簡単にする傾向があることを

$nodes = $xml.SelectNodes('//variable') 

$nodes | ForEach-Object { 
    New-Variable -Name $_.name -Value $_.value 
} 

$nodes | Select-Object -Expand name | ForEach-Object { 
    $var = Get-Variable -Name $_ 
    $var.Value = $ExecutionContext.InvokeCommand.ExpandString($var.Value) 
} 

注意を。

関連する問題