Bagaimana cara menggunakan file konfigurasi (ini, conf, ...) dengan Skrip PowerShell?

14

Apakah mungkin menggunakan file konfigurasi dengan skrip PowerShell?

Misalnya, file konfigurasi:

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

Dan kemudian panggil informasi ini dalam skrip PS1:

start-process iexplore.exe $Link1
Xavier C
sumber

Jawaban:

17

Terima kasih banyak atas bantuan Anda, Dennis dan Tim! Jawaban Anda membuat saya di jalur yang baik dan saya menemukan ini

PENGATURAN.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

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

kemudian

Setelah mengeksekusi cuplikan kode, variabel ($ h) akan berisi nilai-nilai dalam HashTable.

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

* Untuk mengambil item dari tabel, gunakan perintah $h.Get_Item("MySetting1").*

Xavier C
sumber
4
Anda juga bisa mendapatkan pengaturan dengan $ h.MySetting1 yang jauh lebih ramah
Ryan Shillington
Saya mendapatkan array di luar batas dalam garis parser regex, meskipun menggunakan file .txt yang sama persis seperti yang ditunjukkan dalam jawaban ini dan kode parser (tidak ada perubahan) => 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.IndexOutOfRangeExceptionApakah ada yang punya ini berfungsi dengan benar?
Shiva
Jika file konfigurasi Anda tidak memiliki [Sections]atau ; semicolon comments, Anda dapat melakukannya dengan adil $config = Get-Content $ConfigPath | ConvertFrom-StringData. Lihat ConvertFrom-StringData untuk detailnya.
asmironov
4

Ada utas yang bagus di sini yang menunjukkan kode ini (mengutip dari utas tertaut):

# 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

Maka Anda dapat melakukan:

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

Dengan asumsi file INI terlihat seperti ini:

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

Sayangnya, regex hilang dari kode pada tautan sehingga Anda harus mereproduksi mereka, tetapi ada versi yang menangani file tanpa header bagian dan baris yang merupakan komentar.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Anda dapat menangani komentar dengan mudah hanya dengan menambahkan case lain ke switchwith '^#' {}. Anda juga dapat mengakses konten yang dapat hashtable dengan sebuah titik, jadi $links.vendors.link1sebaiknya Anda juga bekerja yang mungkin sedikit lebih baik untuk dibaca.
Joey
2

ya, cmdlet yang Anda cari adalah get-content dan select-string.

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

Untuk pendekatan yang lebih komprehensif, pertimbangkan https://github.com/alekdavis/ConfigFile . Modul ini mendukung file konfigurasi dalam format JSON, juga INI. Ini memungkinkan perluasan variabel dan melakukan beberapa trik yang rapi. Yang perlu diingat adalah bahwa nama pasangan kunci-nilai dalam file INI harus cocok dengan nama-nama parameter atau variabel skrip.

Alek Davis
sumber