Wie verwende ich eine Konfigurationsdatei (ini, conf,…) mit einem PowerShell-Skript?

14

Ist es möglich, eine Konfigurationsdatei mit einem PowerShell-Skript zu verwenden?

Zum Beispiel die Konfigurationsdatei:

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

Rufen Sie dann diese Informationen im PS1-Skript auf:

start-process iexplore.exe $Link1
Xavier C
quelle

Antworten:

17

Vielen Dank für Ihre Hilfe Dennis und Tim! Ihre Antworten haben mich auf die gute Spur gebracht und ich habe dies gefunden

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

POWERSHELL-BEFEHL

#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]) } }

dann

Nach dem Ausführen des Code-Snippets enthält eine Variable ($ h) die Werte in einer HashTable.

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

* Verwenden Sie den Befehl, um ein Element aus der Tabelle abzurufen $h.Get_Item("MySetting1").*

Xavier C
quelle
4
Sie können die Einstellungen auch von dem viel freundlicheren $ h.MySetting1
Ryan Shillington
Ich erhalte eine Ausnahmebedingung "Array out of bounds" in der Regex-Parser-Zeile, obwohl ich genau dieselbe TXT-Datei wie in dieser Antwort und den Parser-Code verwende (keine Änderungen) => 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.IndexOutOfRangeExceptionFunktioniert dies bei jemandem ordnungsgemäß?
Shiva
Wenn Sie keine Konfigurationsdatei [Sections]oder haben ; semicolon comments, können Sie dies einfach tun $config = Get-Content $ConfigPath | ConvertFrom-StringData. Weitere Informationen finden Sie unter ConvertFrom-StringData .
Asmironov
4

Es gibt hier einen guten Thread , der diesen Code zeigt (aus dem verlinkten Thread zitierend):

# 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

Dann können Sie tun:

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

Angenommen, eine INI-Datei sieht folgendermaßen aus:

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

Leider fehlen die regulären Ausdrücke im Code des Links, sodass Sie sie reproduzieren müssen. Es gibt jedoch eine Version, die Dateien ohne Abschnittsüberschriften und Kommentarzeilen verarbeitet.

Bis auf weiteres angehalten.
quelle
Sie können Kommentare einfach verarbeiten, indem Sie dem switchwith einen weiteren Fall hinzufügen '^#' {}. Sie können auch mit einem Punkt auf Hashtable-Inhalte zugreifen, sodass auch diese $links.vendors.link1funktionieren sollten, die möglicherweise etwas besser zu lesen sind.
Joey
2

Ja, die Cmdlets, nach denen Sie suchen, sind get-content und select-string.

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

Ein umfassenderes Konzept finden Sie unter https://github.com/alekdavis/ConfigFile . Dieses Modul unterstützt Konfigurationsdateien im JSON-Format sowie INI. Es erlaubt das Erweitern von Variablen und macht ein paar nette Tricks. Beachten Sie, dass die Namen der Schlüssel-Wert-Paare in der INI-Datei mit den Namen der Skriptparameter oder -variablen übereinstimmen müssen.

Alek Davis
quelle