Làm cách nào để sử dụng tệp cấu hình (ini, conf, ') với PowerShell Script?


14

Có thể sử dụng tệp cấu hình với tập lệnh PowerShell không?

Ví dụ: tệp cấu hình:

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

Và sau đó gọi thông tin này trong tập lệnh PS1:

start-process iexplore.exe $Link1

Câu trả lời:


17

Cảm ơn rất nhiều vì sự giúp đỡ của bạn Dennis và Tim! Câu trả lời của bạn đưa tôi đi đúng hướng và tôi đã tìm thấy điều này

CÀI ĐẶT.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

QUY TẮC 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]) } }

sau đó

Sau khi thực thi đoạn mã, một biến ($ h) sẽ chứa các giá trị trong HashTable.

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

* Để lấy một mục từ bảng, sử dụng lệnh $h.Get_Item("MySetting1").*


4
Bạn cũng có thể nhận được các cài đặt bằng $ h.MySetting1
Ryan Shillington

Tôi nhận được một mảng ngoài giới hạn trong dòng trình phân tích cú pháp regex, mặc dù sử dụng cùng một tệp .txt được hiển thị trong câu trả lời này và mã trình phân tích cú pháp (không có thay đổi) => 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.IndexOutOfRangeExceptionCó ai có điều này hoạt động chính xác không?
Shiva

Nếu bạn cấu hình tập tin không có [Sections]hoặc ; semicolon comments, bạn có thể làm $config = Get-Content $ConfigPath | ConvertFrom-StringData. Xem ConvertFrom-StringData để biết chi tiết.
asmironov

4

Có một chủ đề tốt ở đây hiển thị mã này (trích dẫn từ luồng được liên kết):

# 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

Sau đó, bạn có thể làm:

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

Giả sử một tệp INI trông như thế này:

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

Thật không may, các biểu thức chính bị thiếu trong mã tại liên kết nên bạn sẽ phải sao chép chúng, nhưng có một phiên bản xử lý các tệp mà không có tiêu đề phần và dòng là nhận xét.


Bạn có thể giải quyết yêu cầu một cách dễ dàng bởi chỉ cần thêm một trường hợp khác đến switchvới '^#' {}. Ngoài ra, bạn cũng có thể truy cập nội dung có thể băm bằng dấu chấm, do đó, cũng $links.vendors.link1nên hoạt động để đọc tốt hơn một chút.
Joey

2

vâng, các lệnh ghép ngắn mà bạn đang tìm kiếm là get-content và select-string.

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

0

Để có cách tiếp cận toàn diện hơn, hãy xem xét https://github.com/alekdavis/ConfigFile . Mô-đun này hỗ trợ các tệp cấu hình ở định dạng JSON, cũng như INI. Nó cho phép mở rộng các biến và thực hiện một vài thủ thuật gọn gàng. Điều cần nhớ là tên của các cặp khóa-giá trị trong tệp INI phải khớp với tên của các tham số hoặc biến tập lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.