Вопрос по – Загружать хеш-таблицу PowerShell из файла?

11

Я получил файл, содержащий некоторые данные в нотации объектов PowerShell:

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

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

Ваш Ответ

6   ответов
7

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

Error: User Rate Limit Exceeded Roger Lipscombe
17

(I figured it out while putting together a repro)

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

Get-Content возвращает массив со строками в файле;Out-String используется, чтобы соединить их вместе.

Invoke-Expression затем запускает скрипт, и результат фиксируется. Это открыто для инъекционных атак, но в этом случае все в порядке.

Или, если вы предпочитаете краткий PowerShell:

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

(Я не могу найти более короткую формуOut-String)

Error: User Rate Limit Exceeded
4

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

$data = <path>\data.ps1
Error: User Rate Limit Exceeded Roger Lipscombe
4

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

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

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

$hash.GetType()

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

$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData
Вы также можете просто использоватьGet-Content -Raw .\test.txt который останавливает файл по очередиConvertFrom-StringData; geekality.net/2014/06/30/powershell-read-hashtable-from-a-file
0

Начиная с PowerShell 5.0 у вас есть

Import-PowerShellDataFile

Который импортирует значения из .psd1-файла. Поэтому единственное, что вам нужно сделать, это переименовать ваш файл в * .psd1

Официальная помощьВот.

1

Это старый пост, но это своего рода поворот вашего принятого решения и, возможно, немного более «безопасный», помните о недоверенных файлах.

Из ваших заметок у вас есть файл, который содержит хеш-таблицу с использованием синтаксиса Powershell. Учитывая это ограничение, вы можете импортировать его напрямую:

$HashPath = ".\foo.pson"
# input file contents
$filecontent = Get-Content -Path $HashPath -Raw -ErrorAction Stop
# put the file in a script block
$scriptBlock = [scriptblock]::Create( $filecontent )
#check that the file contains no other Powershell commands
$scriptBlock.CheckRestrictedLanguage( $allowedCommands, $allowedVariables, $true )
#execute it to create the hashtable 
$hashtable = ( & $scriptBlock ) 

Обратите внимание на$scriptBlock.CheckRestrictedLanguage Вы можете заменить это

$scriptBlock.CheckRestrictedLanguage([string[]]@(), [string[]]@(), $false)

Используйте пустой список строк, поэтому мы не допускаем никаких команд Powershell. При импорте хеш-таблицы это именно то, что мы хотим. Это последнийallowEnvironmentVariables поэтому мы ограничиваем это в этом примере$false.

Напомним, что модуль Powershell (файл psd1) - это просто хеш-таблица, поэтому эта концепция может помочь вам также включать блоки скриптов или другие вещи.

Ссылка:https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.checkrestrictedlanguage?view=powershellsdk-1.1.0

Похожие вопросы