2012-12-04 17 views
11

Ben Foo.ps1Bir yapılandırma dosyasını Powershell komut dosyalarına nasıl tanıtabilirim?

denilen bir PowerShell komut dosyası olduğunu varsayalım

ben gibi benim ortam ayarları şey belirtebilirsiniz

Foo.ps1.config

denilen bir XML yapılandırma dosyası tanıtmak istiyoruz:

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

Ve sonra bu yapılandırmayı Foo.ps1'in başlangıcında yüklemek istiyorum, böylece modüllerimi ve nokta notasyonunu İşlevler dizinine alabilirim.

Bunu Powershell'de nasıl yapabilirim?

+1

bana mantıklı görünüyor web üzerinde buldum: İşte çıkış olduğunu http://www.bjd145.org/2008/01/powershell-and-xml-configuration-files.html – pencilCake

+0

Veya bu bir: http://rkeithhill.wordpress.com/2006/06/01/creating-and-using-a-configuration-file-for-your-powershell-scripts/ – pencilCake

+0

Daha önce Keith'in çözümünü kullandım , bir tedavi çalışır. – nimizen

cevap

7

Keith's solution dayanarak ... Kod yüklemek için 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 değerlerinden değişkenleri doldurmak için:

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

Ve ilişkili XML: Muhtemelen

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    </startup> 
    <appSettings> 
<!--Vars --> 
    <add key="var1" value="variableValue1"/> 
    <add key="var2" value="variableValue2"/> 
    </appSettings> 
</configuration> 
9

Daha kolay bir çözüm .... Yapılandırma dosyanızın ad olduğunu varsayarak "Con

PS Testing> $configFile.configuration.appsettings 
#comment        add 
--------        --- 
Vars         {add, add} 

PS Testing> $configFile.configuration.appsettings.add 
key         value 
---         ----- 
var1         variableValue1 
var2         variableValue2 

PS Testing> $configFile.configuration.appsettings.add[0].value 
variableValue2 

Uzun lafın kısası: Yeni değişkenin dışında

PS Testing> [xml]$configFile= get-content .\Config=.xml 
PS Testing> $configFile 
xml         configuration 
---         ------------- 
version="1.0"      configuration 

Okuma verileri: "fix.xml, bu deneyin XML olarak Değişkeninizi Cast ve bir get-içeriği barındırır. Bu durumda

, Yapılandırma.xml şuna benzer:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    </startup> 
    <appSettings> 
    <!--Vars --> 
    <add key="var1" value="variableValue1"/> 
    <add key="var2" value="variableValue2"/> 
    </appSettings> 
</configuration> 
6

XML konfigürasyona alternatif için, yapılandırma diğer türü kullanmak esnek olup olmadığını. Genel bir PS yapılandırma dosyası kullanmanızı öneriyorum ve şu şekilde:

Bir Powershell yapılandırma dosyası oluşturun (Örn. Config.ps1), sonra tüm yapılandırmayı genel değişken olarak koyun ve bunu ilk adım olarak başlatın. komut dosyası bağlamı.

Bu yaklaşımın avantajı, scalar değişken, koleksiyonlar ve karmalar gibi çeşitli veri yapısının Config.ps1 PS dosyasında kullanılabilmesi ve PS kodunda kolayca referans alınabilmesidir. Burada C

enter image description here

:

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

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


sonra fonksiyonları Konfig gelen/değişkenler yük: yapılandırma \ Config.ps1 dosyası \


aşağıdaki eylem bir örnektir. Bu modüldeki ps1 dosyası C: \ Modül \ PSModule.psm1, böyle:

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

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

La stly, başlatma betiği aşağıdaki şu satırı içerir: (C: \ Init.ps1).

Init.ps1 dosyasını çalıştırdıktan sonra. global: config değişkeniniz script içeriğinizde mevcut olacaktır.
enter image description here

İlgili konular