PowerShell स्क्रिप्ट के साथ कॉन्फ़िग फ़ाइल (ini, conf,…) का उपयोग कैसे करें?


14

क्या PowerShell स्क्रिप्ट के साथ कॉन्फ़िगरेशन फ़ाइल का उपयोग करना संभव है?

उदाहरण के लिए, कॉन्फ़िगरेशन फ़ाइल:

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

और फिर PS1 स्क्रिप्ट में इस जानकारी को कॉल करें:

start-process iexplore.exe $Link1

जवाबों:


17

आपकी मदद के लिए बहुत धन्यवाद डेनिस और टिम! आपके जवाबों ने मुझे अच्छे रास्ते पर ला खड़ा किया और मैंने यह पाया

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

पॉर्शहेल कमांड

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

फिर

कोड स्निपेट को निष्पादित करने के बाद, एक चर ($ h) में हैशटेबल में मान शामिल होंगे।

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

* तालिका से किसी आइटम को पुनः प्राप्त करने के लिए, कमांड का उपयोग करें $h.Get_Item("MySetting1").*


4
तुम भी $ ज्यादा से सेटिंग कर सकते हैं $ h.Myetet1
रयान

मैं रेगेक्स पार्सर लाइन में सीमा अपवाद से एक सरणी प्राप्त करता हूं, इस उत्तर में दिखाए गए सटीक .txt फ़ाइल और पार्सर कोड (कोई परिवर्तन नहीं) के उपयोग के बावजूद => 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.IndexOutOfRangeExceptionक्या किसी के पास यह सही ढंग से काम कर रहा है?
शिव

यदि आप फ़ाइल को कॉन्फ़िगर नहीं करते हैं [Sections]या ; semicolon comments, आप बस कर सकते हैं$config = Get-Content $ConfigPath | ConvertFrom-StringData । देखें ConvertFrom-StringData जानकारी के लिए।
asmironov

4

यहाँ एक अच्छा धागा है जो इस कोड को दिखाता है (लिंक किए गए धागे से उद्धृत):

# 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

तो आप कर सकते हैं:

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

इस तरह दिखने वाली एक INI फाइल को मान लें:

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

दुर्भाग्यवश लिंक पर कोड से रीजिक्स गायब हैं, इसलिए आपको उन्हें पुन: प्रस्तुत करना होगा, लेकिन एक संस्करण है जो अनुभाग हेडर और लाइनों के बिना फाइलों को संभालता है जो टिप्पणियां हैं।


आप केवल एक अन्य मामले को इसके switchसाथ जोड़कर टिप्पणियों को आसानी से संभाल सकते हैं '^#' {}। इसके अलावा आप हैशटेबल कंटेंट को एक डॉट के साथ भी एक्सेस कर सकते हैं, इसलिए $links.vendors.link1काम भी करना चाहिए जो पढ़ने में थोड़ा बेहतर हो।
जॉय

2

हाँ, आप जिस cmdlets की तलाश कर रहे हैं वह सामग्री और चयन-स्ट्रिंग है।

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

0

अधिक व्यापक दृष्टिकोण के लिए, https://github.com/alekdavis/ConfigFile पर विचार करें । यह मॉड्यूल JSON प्रारूप, साथ ही INI में कॉन्फ़िगर फ़ाइलों का समर्थन करता है। यह चर का विस्तार करने की अनुमति देता है और कुछ साफ चालें करता है। याद रखने वाली बात यह है कि INI फाइल में की-वैल्यू पेयर के नाम स्क्रिप्ट पैरामीटर या वैरिएबल के नाम से मेल खाने चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.