วิธีใช้ไฟล์ปรับแต่ง (ini, conf, …) กับสคริปต์ PowerShell


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

คำสั่ง 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]) } }

แล้วก็

หลังจากดำเนินการข้อมูลโค้ดแล้วตัวแปร ($ h) จะมีค่าใน HashTable

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

* หากต้องการดึงไอเท็มจากตารางให้ใช้คำสั่ง $h.Get_Item("MySetting1").*


4
นอกจากนี้คุณยังสามารถรับการตั้งค่าได้จาก $ h.MySetting1 ที่เป็นมิตรมากขึ้น
Ryan Shillington

ฉันได้รับข้อยกเว้นอาเรย์ในขอบเขตของตัวแยกวิเคราะห์ regex แม้จะใช้ไฟล์. txt ที่เหมือนกันทั้งหมดที่แสดงในคำตอบนี้และรหัส parser (ไม่มีการเปลี่ยนแปลง) => 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ทุกคนทำงานนี้ถูกต้องหรือไม่?
พระอิศวร

หากคุณไฟล์ config ไม่ได้[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

น่าเสียดายที่ regexes หายไปจากรหัสที่ลิงค์ดังนั้นคุณจะต้องทำซ้ำ แต่มีรุ่นที่จัดการไฟล์โดยไม่มีส่วนหัวและบรรทัดที่มีความคิดเห็น


คุณสามารถจัดการกับความคิดเห็นได้อย่างง่ายดายโดยเพียงแค่เพิ่มอีกกรณีหนึ่งไปด้วยswitch '^#' {}นอกจากนี้คุณยังสามารถเข้าถึงเนื้อหา hashtable ด้วยจุดเช่นกันดังนั้น$links.vendors.link1ควรทำงานด้วยซึ่งอาจดีกว่าการอ่านเล็กน้อย
Joey

2

ใช่ cmdlets ที่คุณต้องการคือเนื้อหาและการเลือกสตริง

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

0

สำหรับวิธีการที่ครอบคลุมมากขึ้นพิจารณาhttps://github.com/alekdavis/ConfigFile โมดูลนี้รองรับไฟล์กำหนดค่าในรูปแบบ JSON เช่นเดียวกับ INI อนุญาตให้มีการขยายตัวของตัวแปร สิ่งที่ต้องจำคือชื่อของคู่คีย์ - ค่าในไฟล์ INI ต้องตรงกับชื่อของพารามิเตอร์สคริปต์หรือตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.