У меня есть файл, содержащий некоторые данные в описании объектов PowerShell:
@{ X = 'x'; Y = 'y' }
Я хотел бы загрузить это в переменную из файла.
У меня есть файл, содержащий некоторые данные в описании объектов PowerShell:
@{ X = 'x'; Y = 'y' }
Я хотел бы загрузить это в переменную из файла.
(я понял это при составлении репрограммы)
PS> $content = ( Get-Content .\foo.pson | Out-String )
PS> $data = ( Invoke-Expression $content )
Get-Content
возвращает массив с строками в файле; Out-String
используется для их объединения.
Invoke-Expression
затем запускает script, и результат захватывается. Это доступно для инъекций, но в этом случае ОК.
Или, если вы предпочитаете свой PowerShell terse:
PS> $data = gc .\foo.pson | Out-String | iex
(Я не могу найти более короткую форму Out-String
)
Я использовал ConvertFrom-StringData. Если вы хотите использовать этот подход, вам нужно будет изменить способ хранения пар ключ/значение с каждой в своей строке и без кавычек:
#Contents of test.txt
X = x
Y = y
get-content .\test.txt | ConvertFrom-StringData
Name Value
---- -----
X x
Y y
ConvertFrom-StringData - это встроенный командлет. Я создал соответствующую функцию ConvertTo-StringData, доступную здесь http://poshcode.org/1986
Если вы можете предоставить этому файлу расширение .ps1
, скажем, data.ps1
, то это не может быть проще, чем этот код:
$data = <path>\data.ps1
У меня возникла проблема с использованием ConvertFrom-StringData, как было предложено @Chad. Если вы выполните:
$hash = get-content .\test.txt | ConvertFrom-StringData
Я обнаружил, что у меня есть массив объектов, а не хеш-таблица. На самом деле, похоже, что у меня был массив хеш-таблиц, каждый с одной записью. Я подтвердил:
$hash.GetType()
Похоже, вам нужно присоединиться к каждой строке сломанного входного файла, чтобы убедиться, что он образует одну строку для ConvertFrom.. use:
$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData