Tôi đã có một tập tin có chứa một số dữ liệu trong PowerShell Object Notation:Tải PowerShell có thể bắt đầu từ một tệp?
@{ X = 'x'; Y = 'y' }
Tôi muốn tải này vào một biến từ tập tin.
Tôi đã có một tập tin có chứa một số dữ liệu trong PowerShell Object Notation:Tải PowerShell có thể bắt đầu từ một tệp?
@{ X = 'x'; Y = 'y' }
Tôi muốn tải này vào một biến từ tập tin.
(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
)
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
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. –
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
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. –
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
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ó 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 –