2012-05-24 30 views

Trả lời

13

(I figured it out khi đặt cùng một repro)

PS> $content = (Get-Content .\foo.pson | Out-String) 
PS> $data = (Invoke-Expression $content) 

Get-Content trả về một mảng với các dòng trong tập tin; Out-String được sử dụng để kết hợp chúng lại với nhau.

Invoke-Expression sau đó chạy tập lệnh và kết quả được chụp. Điều này là mở cho các cuộc tấn công tiêm, nhưng đó là OK trong trường hợp này.

Hoặc, nếu bạn thích PowerShell của bạn ngắn gọn:

PS> $data = gc .\foo.pson | Out-String | iex 

(Tôi không thể tìm thấy một hình thức ngắn hơn Out-String)

+0

Có lẽ đây là một điều Powershell 4 nhưng tôi có thể bỏ qua phần Out-String và chỉ cần làm: $ hash = Get-Content. \ file.pson | Invoke-Expression –

4

Nếu bạn có thể cung cấp cho tập tin này mở rộng .ps1, nói, sau đó data.ps1 nó không thể đơn giản hơn mã này:

$data = <path>\data.ps1 
+0

True (và tôi đã không nhận ra rằng tôi không phải dot nguồn tập tin), nhưng sau đó nó có vẻ như nó có thể được chạy trực tiếp, mà tôi không đặc biệt muốn. –

6

Tôi đã sử dụng ConvertFrom-StringData. Nếu bạn muốn sử dụng phương pháp này, bạn sẽ cần phải thay đổi cách bạn lưu trữ cặp khóa/giá trị với nhau trên một dòng riêng và không có dấu ngoặc kép:

#Contents of test.txt 
X = x 
Y = y 

get-content .\test.txt | ConvertFrom-StringData 

Name       Value 
----       ----- 
X        x 
Y        y 

ConvertFrom-StringData là một built-in cmdlet. Tôi đã tạo hàm ConvertTo-StringData tương ứng tại đây http://poshcode.org/1986

+0

Tôi đã không đề cập đến nó trong câu hỏi (để giữ cho mọi thứ đơn giản), nhưng các tập tin thực sự có chứa một cây đối tượng: một mảng hashtables, có chứa các mảng khác và hashtables. –

4

Tôi gặp sự cố khi sử dụng ConvertFrom-StringData như @Chad đề xuất. Nếu bạn làm:

$hash = get-content .\test.txt | ConvertFrom-StringData 

Tôi thấy tôi có mảng đối tượng chứ không phải bảng băm. Trong thực tế, có vẻ như tôi đã có một mảng các bảng băm, mỗi bảng có một mục nhập. Tôi khẳng định với a:

$hash.GetType() 

Có vẻ như bạn cần phải tham gia mỗi dòng của tập tin đầu vào láp để đảm bảo rằng nó tạo thành một chuỗi duy nhất cho ConvertFrom .. 's sử dụng:

$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData 
+2

Bạn cũng có thể sử dụng 'Get-Content -Raw. \ Test.txt' để dừng tệp đang được đường ống theo dòng đến' ConvertFrom-StringData'; http://www.geekality.net/2014/06/30/powershell-read-hashtable-from-a-file/ –

Các vấn đề liên quan