如何在powershell中将嵌套的任意关联数组值设置为.psd1文件?

Posted

技术标签:

【中文标题】如何在powershell中将嵌套的任意关联数组值设置为.psd1文件?【英文标题】:How can I write a nested arbitrary associative Array value set to a .psd1 file in powershell? 【发布时间】:2017-04-27 17:06:56 【问题描述】:

我有一个以编程方式生成的 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,但似乎不存在这样的功能。

【问题讨论】:

我只是想知道修改 psd1 而不只是进行文本操作...及时的问题! Powershell Pipeworks 写了几个函数,可以满足您的需求:Export-PSDataWrite-PowerShellHashtable Export-Clixml 有什么问题? 因为我想将其加载为 .PSD1。我想我可以在 XML 中往返,但为什么不能在 PSD1 中也有往返呢? 很好的问题,我建议在您的答案中添加指向您的feature suggestion on GitHub 的链接。请注意,这些不是您正在处理的 数组 - 仅 [嵌套] hashtables[hashtable] ([System.Collections.Hashtable]) 的实例)。 【参考方案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

【讨论】:

【参考方案2】:

源于这个Save hash table in PowerShell object notation (PSON) 问题,我创建(并且仍在维护)一个演变为ConvertTo-Expression 的PowerShell cmdlet。该脚本的最终目标是能够基于 正确 PowerShell 语法而不是像 [JSON] (或 [XML]。 这包括区分 字节数组字节数组,还包括正确接受(和格式化)单例。 输出为[ScriptBlock],可以轻松保存为表达式。关键是(取决于使用情况)它可能会在最终调用(c.q.dot sourcing)它时产生一个安全漏洞(参见:Running partly trusted PowerShell code in a restricted security environment. #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'

【讨论】:

以上是关于如何在powershell中将嵌套的任意关联数组值设置为.psd1文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中将数组值转换为小写?

如何在 PowerShell 中将计算值写入 SQL INSERT/UPDATE

如何在PowerShell中将哈希字符串转换为字节数组?

在 PDO 中的执行函数中将 NULL 值绑定到具有关联数组的命名占位符的问题

如何在 Swift 中将单个数组转换为嵌套数组? [复制]

如何在javascript中将嵌套集转换为嵌套数组?