Подтвердить что ты не робот

Загрузка хеш-таблицы PowerShell из файла?

У меня есть файл, содержащий некоторые данные в описании объектов PowerShell:

@{ X = 'x'; Y = 'y' }

Я хотел бы загрузить это в переменную из файла.

4b9b3361

Ответ 1

(я понял это при составлении репрограммы)

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)

Ответ 2

Я использовал 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

Ответ 3

Если вы можете предоставить этому файлу расширение .ps1, скажем, data.ps1, то это не может быть проще, чем этот код:

$data = <path>\data.ps1

Ответ 4

У меня возникла проблема с использованием ConvertFrom-StringData, как было предложено @Chad. Если вы выполните:

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

Я обнаружил, что у меня есть массив объектов, а не хеш-таблица. На самом деле, похоже, что у меня был массив хеш-таблиц, каждый с одной записью. Я подтвердил:

$hash.GetType()

Похоже, вам нужно присоединиться к каждой строке сломанного входного файла, чтобы убедиться, что он образует одну строку для ConvertFrom.. use:

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