2012-05-24 84 views

回答

13

(我計算出來而組建一個REPRO)

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

Get-Content返回與文件中的行的陣列; Out-String用於將它們連接在一起。

Invoke-Expression然後運行該腳本,並捕獲結果。這對注射攻擊是開放的,但在這種情況下沒關係。

或者,如果你喜歡簡潔的PowerShell的:

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

(我找不到Out-String較短的形式)

+0

也許這是一個Powershell 4的東西,但我可以跳過Out-String部分,只需要: $ hash = Get-Content。\ file.pson | Invoke-Expression –

4

如果你可以給這個文件的擴展名.ps1,比方說,data.ps1然後它不能簡單比這個代碼:

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

確實(並且我沒有意識到我沒有點源文件),但是看起來它可以直接運行,這並不是我特別想要的。 –

6

我已經使用ConvertFrom-StringData。如果你想用這種方法,你就需要改變你的存儲與各自成一行鍵/值對的方式,不包括引號:

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

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

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

ConvertFrom-StringData是一個內置的cmdlet的。我創建了相應的ConvertTo-StringData函數http://poshcode.org/1986

+0

我沒有在問題中提到它(保持簡單),但文件實際上包含一個對象樹:一個包含其他數組和哈希表的哈希表數組。 –

4

我遇到了麻煩,使用ConvertFrom-StringData作爲@Chad建議。如果你這樣做:

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

我發現我有一個對象數組而不是一個哈希表。事實上,我似乎有一個散列表的數組,每個都有一個條目。我證實了:

$hash.GetType() 

看起來你需要加入咕嚕咕嚕輸入文件的每一行,以確保它構成了ConvertFrom一個字符串..的使用:

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

您也可以使用'Get-ContentRaw。\ test.txt',它將文件逐行地傳送到'ConvertFrom-StringData'; http://www.geekality.net/2014/06/30/powershell-read-hashtable-from-a-file/ –