Jak korzystać z pliku konfiguracyjnego (ini, conf,…) ze skryptem PowerShell?

14

Czy można użyć pliku konfiguracyjnego ze skryptem PowerShell?

Na przykład plik konfiguracyjny:

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

A następnie wywołaj tę informację w skrypcie PS1:

start-process iexplore.exe $Link1
Xavier C.
źródło

Odpowiedzi:

17

Wielkie dzięki za pomoc Dennis i Tim! Twoje odpowiedzi postawiły mnie na dobrej drodze i znalazłem to

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

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

następnie

Po wykonaniu fragmentu kodu zmienna ($ h) będzie zawierać wartości w tabeli HashTable.

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

* Aby pobrać element z tabeli, użyj polecenia $h.Get_Item("MySetting1").*

Xavier C.
źródło
4
Możesz także pobrać ustawienia przez znacznie bardziej przyjaznego $ h.MySetting1
Ryan Shillington
Otrzymuję tablicę poza zakresem w wierszu analizatora wyrażeń regularnych, pomimo użycia dokładnie tego samego pliku .txt pokazanego w tej odpowiedzi i kodu analizatora składni (bez zmian) => 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.IndexOutOfRangeExceptionCzy ktoś działa poprawnie?
Shiva
Jeśli plik konfiguracyjny nie ma [Sections]lub ; semicolon commentsmożesz to zrobić $config = Get-Content $ConfigPath | ConvertFrom-StringData. Aby uzyskać szczegółowe informacje, zobacz ConvertFrom-StringData .
asmironov
4

Jest tutaj dobry wątek , który pokazuje ten kod (cytowanie z połączonego wątku):

# 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

Następnie możesz zrobić:

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

Zakładając, że plik INI wygląda następująco:

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

Niestety, w kodzie linku brakuje wyrażeń regularnych, więc musisz je odtworzyć, ale istnieje wersja, która obsługuje pliki bez nagłówków sekcji i wierszy będących komentarzami.

Wstrzymano do odwołania.
źródło
Można obsługiwać komentarzy łatwo po prostu dodając kolejną sprawę switchz '^#' {}. Możesz również uzyskać dostęp do treści z hashowaniem za pomocą kropki, więc też $links.vendors.link1powinna działać, co może być nieco lepiej czytać.
Joey,
2

tak, cmdlety, których szukasz, to get-content i select-string.

$content=get-content C:\links.txt
start-process iexplore.exe $content[0]
Tim
źródło
0

Aby uzyskać bardziej kompleksowe podejście, rozważ https://github.com/alekdavis/ConfigFile . Moduł obsługuje pliki konfiguracyjne w formacie JSON, a także INI. Pozwala rozszerzać zmienne i wykonuje kilka porządnych sztuczek. Należy pamiętać, że nazwy par klucz-wartość w pliku INI muszą być zgodne z nazwami parametrów lub zmiennych skryptu.

Alek Davis
źródło