Как я могу записать вложенное произвольное значение ассоциативного массива в файл.psd1 в powershell?
У меня есть объект Array powershell, который генерируется программно, что-то с массивами внутри массивов, внутри массивов, иногда называемое "пакетом свойств" или "хеш-таблицей", но я думаю, что он изначально называется "Массив, содержащий массивы" в самом родном PowerShell терминология.
Например:
@{
Version = '1.0.0'
Name = 'thing'
Revision = 'c3a89cd20e19bb82f41e95e0806edc5b6cfd224e'
Date = '2016-12-09'
Build = '1234'
Contents = @{
"index.html" = "23dd7b993f40bb3ae8848fe104b3b767"
}
}
Создание функции для сохранения только одного определенного набора содержимого в файл.PSD1 кажется недостаточно общим. Я хочу сохранить точную структуру массива в памяти в файл PSD1. Существует ли какой-либо встроенный способ в Powershell для сохранения переменной в памяти со значениями выше? "Противоположная функция" Import-PowershellDataFile
, Я бы предположил, что это будет называться Export-PowershellDatafile
но, похоже, такой функции не существует.
0 ответов
Исходя из этого вопроса Сохранить хеш-таблицу в нотации объектов PowerShell (PSON), я создал (и все еще поддерживаю) командлет PowerShell, который превратился в ConvertTo-Expression
. Конечная цель этого скрипта - иметь возможность экспортировать и импортировать объекты PowerShell между системами на основе правильного синтаксиса PowerShell, а не экзотического формата, такого как [JSON
](или [XML
].
Это включает различие между массивом байтов и массивом байтов, а также правильное принятие (и форматирование) синглетонов.
На выходе[ScriptBlock]
которое можно легко сохранить как выражение. Дело в том, что (в зависимости от использования) он может создать брешь в безопасности при его вызове (cq dot sourcing) (см.: Запуск частично доверенного кода PowerShell в ограниченной среде безопасности.
#12377
).
В любом случае, я также добавил-Explore
параметр, который, как я полагаю, дает точно такой же результат, как требуется для PSD1
Файл данных PowerShell. На самом деле я никогда раньше не думал об этом использовании, но теперь рассматриваю возможность использовать псевдоним этого параметра и придать ему исключительное значениеPSD1
файлы в моей следующей версии.
Другими словами:
$Data = @{
Version = '1.0.0'
Name = 'thing'
Revision = 'c3a89cd20e19bb82f41e95e0806edc5b6cfd224e'
Date = '2016-12-09'
Build = '1234'
Contents = @{
"index.html" = "23dd7b993f40bb3ae8848fe104b3b767"
}
}
ConvertTo-Expression -Explore $Data # | Out-File .\MyData.psd1
Возвращает [ScriptBlock]
который автоматически преобразуется в следующее выражение, например, при экспорте в файл или простом отображении:
@{
'Date' = '2016-12-09'
'Revision' = 'c3a89cd20e19bb82f41e95e0806edc5b6cfd224e'
'Version' = '1.0.0'
'Build' = '1234'
'Contents' = @{'index.html' = '23dd7b993f40bb3ae8848fe104b3b767'}
'Name' = 'thing'
}
Вы пытались использовать New-ModuleManifest
? Не зная каких-либо дополнительных деталей, создается впечатление, что вы создаете что-то, по сути, похожее на файл манифеста, используемый в модуле... Но даже если ваш вариант использования отличается, вы все равно сможете использовать командлет.
New-ModuleManifest
был в течение некоторого времени (по крайней мере, начиная с v3, но я вспоминаю, что использовал его также и с v2). Это позволяет вам определить хеш-таблицу свойств и сохранить ее как .psd1
,