12

我有一个以编程方式生成的 powershell Array 对象,在数组内部,数组内部有数组,有时称为“属性包”或“哈希表”,但我认为它在最原生的 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,但似乎不存在这样的函数。

4

2 回答 2

1

源于此Save hash table in PowerShell object notation (PSON)问题,我创建(并且仍在维护)一个演变为ConvertTo-Expression. 该脚本的最终目标是能够基于正确的PowerShell 语法而不是像 [ ]( 或 [ ] 这样的奇异格式在系统之间导出和导入PowerShell对象。 这包括区分字节数组字节数组,但也正确接受(和格式化)单例。 输出可以很容易地保存为表达式。关键是(取决于使用情况)它可能会在最终调用时创建一个安全漏洞(cqJSONXML

[ScriptBlock]dot sourcing)它(请参阅:在受限安全环境中运行部分受信任的 PowerShell 代码。 #12377)。
无论如何,我还包含了一个参数,我相信它会提供与PowerShell 数据文件-Explore所需的完全相同的输出。PSD1实际上,我之前从未想过这种用法,但现在考虑给这个参数起别名,并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

返回 a[ScriptBlock]在例如将其导出到文件或仅显示它时自动转换为以下表达式:

@{
        'Date' = '2016-12-09'
        'Revision' = 'c3a89cd20e19bb82f41e95e0806edc5b6cfd224e'
        'Version' = '1.0.0'
        'Build' = '1234'
        'Contents' = @{'index.html' = '23dd7b993f40bb3ae8848fe104b3b767'}
        'Name' = 'thing'
}
于 2020-04-19T08:01:46.540 回答
1

你试过使用New-ModuleManifest吗?在不知道任何其他详细信息的情况下,您似乎正在创建与模块中使用的清单文件基本相似的东西......但即使您的用例不同,您仍然应该能够使用 cmdlet。

New-ModuleManifest已经存在了一段时间(至少从 v3 开始,但我似乎记得也将它与 v2 一起使用)。它允许您定义属性哈希表并将其保存为.psd1.

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

于 2019-05-28T22:22:35.667 回答