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

时间:2016-12-12 18:49:48

标签: arrays powershell hashtable propertybag

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

从这个Save hash table in PowerShell object notation (PSON)问题开始,我创建了(并且仍在维护)PowerShell cmdlet,该cmdlet演变为ConvertTo-Expression。此脚本的最终目标是能够基于正确 PowerShell语法而不是像[JSON这样的奇异格式在系统之间导出和导入 PowerShell 对象。 ](或[XML]。
这包括区分 字节数组 字节数组 ,但也可以正确接受(并格式化)单例。
输出为[ScriptBlock],可以轻松将其另存为表达式。关键是(取决于用法)最终调用(参见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' } 在以下情况下会自动转换为以下表达式:将其导出到文件或仅显示它:

        findViewById<Button>(R.id.done_button).setOnClickListener { changeNickname() }