27

Foo.ps1 という Powershell スクリプトがあるとします。

Foo.ps1.config という XML 構成ファイルを紹介したいと思います。

ここで、次のような環境設定を指定できます。

<FunctionsDirectory>
     $ScriptDirectory\Functions
</FunctionsDirectory>
<ModulesDirectory>
     $ScriptDirectory\Modules
</ModulesDirectory>

次に、この構成を Foo.ps1 の先頭にロードして、モジュールとドット表記を Functions ディレクトリにインポートできるようにします。

Powershellでこれを達成するにはどうすればよいですか?

4

4 に答える 4

17

XML 構成の代替として、他のタイプの構成を柔軟に使用できる場合。グローバル PS 構成ファイルを使用することをお勧めします。その方法は次のとおりです:

Powershell 構成ファイル (例: Config.ps1 ) を作成し、すべての構成をグローバル変数として配置し、最初のステップとしてそれを初期化して、スクリプト コンテキストで構成値を使用できるようにします。 .

このアプローチの利点は、スカラー変数、コレクション、ハッシュなどのさまざまなタイプのデータ構造を Config.ps1 PS ファイルで使用し、PS コードで簡単に参照できることです。

以下は実際の例です。

ここに画像の説明を入力

C:\Config\Config.ps1 ファイルは次のとおりです。

$global:config = @{   
    Var1 = "Value1"

    varCollection = @{       
        item0     = "colValue0"
        item1   = "colValue1"
        item2  = "colValue2"
    }       
}

次に、次のように、このモジュール C:\Module\PSModule.psm1 の Config.ps1 ファイルから関数/変数を読み込みます。

$scriptFiles = Get-ChildItem "$PSScriptRoot\Config\*.ps1" -Recurse

foreach ($script in $scriptFiles)
{
    try
    {       
        . $script.FullName 
    }
    catch [System.Exception]
    {
        throw
    }
}

最後に、初期化スクリプトには次の 1 行が含まれます: ( C:\Init.ps1 )。

Import-Module $PSScriptRoot\Module\PSModule.psm1 -Force

Init.ps1 を実行した後。global:config 変数は、スクリプト コンテキストで使用できます。出力は次のとおりです。
ここに画像の説明を入力

于 2015-04-06T23:59:34.203 に答える
11

Keith のソリューションに基づく... XML をロードするコード:

   $configFile = "c:\Path2Config"
    if(Test-Path $configFile) {
        Try {
            #Load config appsettings
            $global:appSettings = @{}
            $config = [xml](get-content $configFile)
            foreach ($addNode in $config.configuration.appsettings.add) {
                if ($addNode.Value.Contains(‘,’)) {
                    # Array case
                    $value = $addNode.Value.Split(‘,’)
                        for ($i = 0; $i -lt $value.length; $i++) { 
                            $value[$i] = $value[$i].Trim() 
                        }
                }
                else {
                    # Scalar case
                    $value = $addNode.Value
                }
            $global:appSettings[$addNode.Key] = $value
            }
        }
        Catch [system.exception]{
        }
    }

XML 値から変数を移入するには:

            $variable1 = $appSettings["var1"]
            $variable2 = $appSettings["var2"]

関連する XML は次のとおりです。

<?xml version="1.0"?>
<configuration>
  <startup>
  </startup>
  <appSettings>
<!--Vars -->
    <add key="var1" value="variableValue1"/>
    <add key="var2" value="variableValue2"/>
  </appSettings>
</configuration>
于 2012-12-04T08:46:31.437 に答える