Как я могу записать вложенное произвольное значение ассоциативного массива в файл.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,

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-modulemanifest?view=powershell-5.1

Другие вопросы по тегам