Tengo un archivo que contiene algunos datos en notación de objetos PowerShell:Cargando una tabla hash PowerShell desde un archivo?
@{ X = 'x'; Y = 'y' }
me gustaría cargar esto en una variable del archivo.
Tengo un archivo que contiene algunos datos en notación de objetos PowerShell:Cargando una tabla hash PowerShell desde un archivo?
@{ X = 'x'; Y = 'y' }
me gustaría cargar esto en una variable del archivo.
(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
)
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
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. –
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
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. –
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
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/ –
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 –