PowerShell Komut Dosyasında bir yapılandırma dosyası (ini, conf,…) nasıl kullanılır?


14

PowerShell betiğiyle bir yapılandırma dosyası kullanmak mümkün müdür?

Örneğin, yapılandırma dosyası:

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

Ve sonra PS1 komut dosyasında bu bilgileri arayın:

start-process iexplore.exe $Link1

Yanıtlar:


17

Dennis ve Tim yardımlarınız için çok teşekkürler! Cevaplarınız doğru yolda beni koymak ve buldum bu

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 KOMUTANLIĞI

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

sonra

Kod snippet'ini yürüttükten sonra, bir değişken ($ h) bir HashTable'daki değerleri içerir.

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

* Tablodan bir öğe almak için şu komutu kullanın: $h.Get_Item("MySetting1").*


4
Ayarları çok daha dostça $ h ile de alabilirsiniz. MySetting1
Ryan Shillington

Bu cevapta gösterilen aynı .txt dosyasını ve ayrıştırıcı kodu (değişiklik yok) => 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.IndexOutOfRangeExceptionHerkes bu düzgün çalışıyor mu rağmen, regex ayrıştırıcı satırında sınırlar istisna dışında bir dizi olsun.
Shiva

Eğer yapılandırma dosyası yoksa [Sections]ya da ; semicolon commentsyapabilirsiniz, sadece yapabilirsiniz $config = Get-Content $ConfigPath | ConvertFrom-StringData. Ayrıntılar için bkz . ConvertFrom-StringData .
asmironov

4

Burada bu kodu gösteren iyi bir iş parçacığı var (bağlı iş parçacığından alıntı):

# 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

Sonra şunları yapabilirsiniz:

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

Şuna benzeyen bir INI dosyası varsayarsak:

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

Maalesef, regex'ler bağlantıdaki kodda eksik olduğundan, bunları yeniden oluşturmanız gerekecek, ancak bölüm üstbilgileri ve satırları olmayan dosyaları işleyen bir sürüm var.


Sadece başka bir davayı ekleyerek kolayca yorumlarınızı işleyebilir switchile '^#' {}. Ayrıca hashtable içeriklere bir nokta ile de erişebilirsiniz, bu yüzden $links.vendors.link1de çalışmak biraz daha iyi olabilir.
Joey

2

evet, aradığınız cmdlet'ler get-content ve select-string.

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

0

Daha kapsamlı bir yaklaşım için https://github.com/alekdavis/ConfigFile adresini göz önünde bulundurun . Bu modül INI'nin yanı sıra JSON biçimindeki yapılandırma dosyalarını da destekler. Değişkenleri genişletmeye izin verir ve birkaç düzgün numara yapar. Hatırlanması gereken şey, INI dosyasındaki anahtar / değer çiftlerinin adlarının komut dosyası parametrelerinin veya değişkenlerinin adlarıyla eşleşmesi gerektiğidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.