2012-05-24 15 views

Antwort

13

(I, während es herausgefunden zusammen eine Repro Putting)

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

Get-Content ein Array mit den Zeilen in der Datei zurückgibt; Die Out-String wird verwendet, um sie zusammenzufügen.

Invoke-Expression dann führt das Skript aus, und das Ergebnis wird erfasst. Dies ist offen für Injektionsangriffe, aber das ist in diesem Fall in Ordnung.

Oder, wenn Sie Ihre Powershell bevorzugen lapidar:

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

(Ich kann nicht eine kürzere Form Out-String finden)

+0

Vielleicht ist eine PowerShell 4-Sache, aber ich bin in der Lage, den Out-String-Teil zu überspringen und einfach: $ hash = Get-Content. \ file.pson | Invoke-Expression –

4

Wenn Sie diese Datei geben die Erweiterung .ps1, sagen wir, data.ps1 dann Es kann nicht einfacher als dieser Code sein:

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

True (und mir war nicht klar, dass ich die Datei nicht per Dot-Source erstellen musste), aber dann sieht es so aus, als könnte es direkt ausgeführt werden, was ich nicht besonders will. –

6

Ich habe ConvertFrom-StringData verwendet. Wenn Sie diesen Ansatz verwenden möchten, müssen Sie die Art und Weise Sie speichern Schlüssel/Wert-Paare mit jeweils einer eigenen Zeile und keine Anführungszeichen ändern:

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

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

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

ConvertFrom-String ist ein Einbau-Cmdlets. Ich erstellte entsprechende ConvertTo-StringData-Funktion hier verfügbar http://poshcode.org/1986

+0

Ich habe es in der Frage nicht erwähnt (um die Dinge einfach zu halten), aber die Datei enthält tatsächlich einen Objektbaum: ein Array von Hashtabellen, die andere Arrays und Hashtables enthalten. –

4

Ich lief Probleme mit ConvertFrom-StringData als @Chad vorgeschlagen. Wenn Sie das tun:

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

Ich fand ich hatte eher ein Objekt-Array als eine Hash-Tabelle. Tatsächlich scheint es, dass ich ein Array von Hash-Tabellen mit jeweils einem Eintrag hatte. Ich bestätigte mit a:

$hash.GetType() 

Es sieht aus wie Sie jede Zeile der schlürfte Eingabedatei müssen sich registrieren, um sicherzustellen, dass es eine einzelne Zeichenfolge für ConvertFrom bildet .. 's Gebrauch:

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

Sie können auch 'Get-Content -Raw. \ Test.txt' verwenden, um die Datei zeilenweise an' ConvertFrom-StringData' zu senden. http://www.geekality.net/2014/06/30/powershell-read-hashtable-from-a-file/ –

Verwandte Themen