2012-12-04 7 views
11

supponga che Ho uno script PowerShell chiamato Foo.ps1Come posso introdurre un file di configurazione negli script di PowerShell?

Vorrei introdurre un file di configurazione XML chiamato Foo.ps1.config

dove posso specificare il mio impostazioni di ambiente qualcosa di simile:

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

E quindi vorrei caricare questa configurazione all'inizio di Foo.ps1 in modo da poter importare i miei moduli e dotare la directory Funzioni.

Come posso ottenere questo in PowerShell?

+1

Ho trovato questo sul web, che sembra ragionevole per me: http://www.bjd145.org/2008/01/powershell-and-xml-configuration-files.html – pencilCake

+0

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

+0

Ho usato la soluzione di Keith prima , funziona a meraviglia. – nimizen

risposta

7

Sulla base Keith's solution ... codice per caricare 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]{ 
     } 
    } 

per popolare le variabili dai valori XML:

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

E l'XML associato:

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

Probabilmente una soluzione più semplice ... Supponendo che il tuo file di configurazione sia un nome "Con fix.xml", provate questo:

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

dati Lettura fuori della vostra nuova variabile:

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 

farla breve: Getta il tuo variabile come XML, e fare un get-contenuti.

In questo caso, il Config.xml assomiglia a questo:

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

Per un'alternativa alla configurazione XML, se siete flessibili di utilizzare altro tipo di configurazione. Suggerisco di utilizzare un file di configurazione PS globale ed ecco come:

Creare un file di configurazione di Powershell (ad esempio Config.ps1), quindi inserire tutta la configurazione come variabile globale e iniziarla come primo passaggio in modo che i valori di configurazione siano disponibili nel contesto di script.

Il vantaggio di questo approccio è che i vari tipi di strutture di dati come la variabile scalare, le raccolte e gli hash possono essere utilizzati nel file PS Config.ps1 e riportati facilmente nel codice PS.

il seguente è un esempio in azione:

enter image description here

Ecco la C: Config \ Config.ps1 file \:

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

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

quindi caricare il funzioni/variabili da Config. file di PS1 in questo modulo C: \ Module \ PSModule.psm1, in questo modo:

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

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

La lo script di inizializzazione contiene questa riga seguente: (C: \ Init.ps1).

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

Dopo l'esecuzione di Init.ps1. globale: la variabile config sarà disponibile nel contesto dello script. Ecco l'output:
enter image description here

Problemi correlati