Come usare un file di configurazione (ini, conf, ...) con uno script PowerShell?


14

È possibile utilizzare un file di configurazione con uno script PowerShell?

Ad esempio, il file di configurazione:

#links
link1=http://www.google.com
link2=http://www.apple.com
link3=http://www.microsoft.com

E quindi chiama queste informazioni nello script PS1:

start-process iexplore.exe $Link1

Risposte:


17

Grazie mille per l'aiuto Dennis e Tim! Le sue risposte mi ha messo in pista buona e ho trovato questo

settings.txt

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
[General]
MySetting1=value

[Locations]
InputFile="C:\Users.txt"
OutputFile="C:\output.log"

[Other]
WaitForTime=20
VerboseLogging=True

COMANDO DI POWERSHELL

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
Get-Content "C:\settings.txt" | foreach-object -begin {$h=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $h.Add($k[0], $k[1]) } }

poi

Dopo aver eseguito lo snippet di codice, una variabile ($ h) conterrà i valori in una tabella hash.

Name                           Value
----                           -----
MySetting1                     value
VerboseLogging                 True
WaitForTime                    20
OutputFile                     "C:\output.log"
InputFile                      "C:\Users.txt"

* Per recuperare un elemento dalla tabella, utilizzare il comando $h.Get_Item("MySetting1").*


4
Puoi anche ottenere le impostazioni dal molto più amichevole $ h.MySetting1
Ryan Shillington

Ottengo una matrice fuori dai limiti dell'eccezione nella riga del parser regex, nonostante usi esattamente lo stesso file .txt mostrato in questa risposta e il codice del parser (nessuna modifica) => Index was outside the bounds of the array. At C:\testConfigreader.ps1:13 char:264 + ... -ne $True)) { $h.Add($k[0], $k[1]) } } + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId : System.IndexOutOfRangeExceptionQualcuno funziona correttamente?
Shiva,

Se il file di configurazione non ha [Sections]o ; semicolon comments, puoi fare solo $config = Get-Content $ConfigPath | ConvertFrom-StringData. Vedi ConvertFrom-StringData per i dettagli.
Asmironov,

4

C'è un buon thread qui che mostra questo codice (citando dal thread collegato):

# from http://www.eggheadcafe.com/software/aspnet/30358576/powershell-and-ini-files.aspx
param ($file)

$ini = @{}
switch -regex -file $file
{
    "^\[(.+)\]$" {
        $section = $matches[1]
        $ini[$section] = @{}
    }
    "(.+)=(.+)" {
        $name,$value = $matches[1..2]
        $ini[$section][$name] = $value
    }
}
$ini

Quindi puoi fare:

PS> $links = import-ini links.ini
PS> $links["search-engines"]["link1"]
http://www.google.com
PS> $links["vendors"]["link1"]
http://www.apple.com

Supponendo un file INI simile al seguente:

[vendors]
link1=http://www.apple.com
[search-engines]
link1=http://www.google.com

Sfortunatamente le regex mancano dal codice al link, quindi dovrai riprodurle, ma c'è una versione che gestisce i file senza intestazioni di sezione e righe che sono commenti.


Puoi gestire facilmente i commenti semplicemente aggiungendo un altro caso al switchcon '^#' {}. Inoltre puoi accedere ai contenuti hashtable anche con un punto, quindi $links.vendors.link1dovrebbe funzionare anche che potrebbe essere un po 'meglio da leggere.
Joey,

2

sì, i cmdlet che stai cercando sono get-content e select-string.

$content=get-content C:\links.txt
start-process iexplore.exe $content[0]

0

Per un approccio più completo, considerare https://github.com/alekdavis/ConfigFile . Questo modulo supporta i file di configurazione in formato JSON e INI. Permette di espandere le variabili e fa alcuni trucchi. La cosa da ricordare è che i nomi delle coppie chiave-valore nel file INI devono corrispondere ai nomi dei parametri o delle variabili dello script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.