如何在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-PSData
和 Write-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文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中将计算值写入 SQL INSERT/UPDATE