2012-05-24 11 views

Respuesta

13

(lo he descubierto, mientras que la elaboración de un repro)

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

Get-Content devuelve una matriz con las líneas en el archivo; el Out-String se usa para unirlos.

Invoke-Expression ejecuta la secuencia de comandos y se captura el resultado. Esto está abierto a ataques de inyección, pero eso está bien en este caso.

O, si prefiere que su PowerShell escueto:

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

(no puedo encontrar una forma más corta de Out-String)

+0

Tal vez esto es una cosa de Powershell 4 pero puedo omitir la parte Out-String y simplemente hacer: $ hash = Get-Content. \ file.pson | Invoke-Expression –

4

Si usted puede dar a este archivo de la extensión .ps1, digamos, a continuación, data.ps1 no puede ser más simple que este código:

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

Verdadero (y no me di cuenta de que no tenía que dot-source el archivo), pero parece que se puede ejecutar directamente, lo que no quiero especialmente. –

6

He utilizado ConvertFrom-StringData. Si desea utilizar este método tendrá que cambiar la forma en que almacena pares clave/valor con cada uno en su propia línea y sin comillas:

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

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

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

ConvertFrom-StringData es un cmdlet incorporado. Creé la función ConvertTo-StringData correspondiente disponible aquí http://poshcode.org/1986

+0

No lo mencioné en la pregunta (para mantener las cosas simples), pero el archivo en realidad contiene un árbol de objetos: una matriz de tablas hash, que contiene otras matrices y hashtables. –

4

Tuve problemas al usar ConvertFrom-StringData como @Chad sugirió. Si lo hace:

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

Encontré que tenía una matriz de objetos en lugar de una tabla hash. De hecho, parece que tenía una matriz de tablas hash, cada una con una sola entrada. Me confirmó con un:

$hash.GetType() 

Parece que necesita para unirse a cada línea del archivo de entrada slurped para asegurar que se forma una sola cadena para uso ConvertFrom .. 's:

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

También puede usar 'Get-Content -Raw. \ Test.txt' que detiene el flujo del archivo línea por línea a' ConvertFrom-StringData'; http://www.geekality.net/2014/06/30/powershell-read-hashtable-from-a-file/ –

Cuestiones relacionadas