PowerShell 是不是支持 HashTable 序列化?

Posted

技术标签:

【中文标题】PowerShell 是不是支持 HashTable 序列化?【英文标题】:Does PowerShell support HashTable Serialization?PowerShell 是否支持 HashTable 序列化? 【发布时间】:2020-06-22 14:01:16 【问题描述】:

如果我想将一个对象/哈希表写入磁盘并稍后再次加载它,PowerShell 是否支持?

【问题讨论】:

【参考方案1】:

当然,你可以使用 PowerShell 的 native CliXml format:

@
  a = 1
  b = [pscustomobject]@
    prop = "value"
  
 | Export-Clixml -Path hashtable.ps1xml

使用Import-CliXml反序列化:

PS C:\> $ht = Import-CliXml hashtable.ps1xml
PS C:\> $ht['b'].prop -eq 'value'
True

【讨论】:

确实;值得一提的是在序列化/反序列化期间类型保真度的潜在损失(与您的示例无关) - 请参阅this answer。【参考方案2】:

答案可能取决于哈希表中的数据。对于比较简单的数据 Export-ClixmlImport-CliXml 是原生的,直截了当 PowerShell 解决方案,请参阅另一个答案。

对于更复杂的数据,不能通过CliXml很好地序列化,但.NET可序列化, 您可以使用标准的 .NET 序列化程序之一。例如,BinaryFormatter。 您可以使用(或学习代码)两个现成的脚本:Export-Binary.ps1 和 Import-Binary.ps1。 您可以在Export-Binary.test.ps1 中找到演示示例,包括哈希表。

而且,如果您想有效地存储 许多哈希表,那么请寻找某种类型 文档存储解决方案。我最近发现 LiteDB 对许多人来说非常好 PowerShell 场景。所以我创建了Ldbc,它是 LiteDB 的 PowerShell 包装器,包括电池。 使用这种方式,您可以存储和检索数千个哈希表。

更新:如果您希望以 PSD1(本机 PowerShell 数据格式)存储相对简单的数据,您也可以使用脚本模块 PsdKit。 (感谢@iRon 提醒)

【讨论】:

【参考方案3】:

由于默认的 PowerShell 哈希表 (@...) 是 ObjectObject 类型,因此它不仅仅涉及 HashTable 类型,但问题意味着 any 的序列化( value) 类型到磁盘。

除了@Mathias R. Jessen 的回答,您还可以使用 PowerShell 序列化程序 (System.Management.Automation.PSSerializer) 来解决这个问题:

序列化到磁盘

[System.Management.Automation.PSSerializer]::Serialize($HashTable) | Out-File .\HashTable.txt

从磁盘反序列化

$PSSerial = Get-Content .\HashTable.txt
$HashTable = [System.Management.Automation.PSSerializer]::Deserialize($PSSerial)

您也可以使用这个ConvertTo-Expression cmdlet。缺点是涉及用于序列化的非标准 PowerShell cmdlet,但优点是您可以使用标准且简单的 dot-sourcing 技术来恢复它:

序列化到磁盘

$HashTable | ConvertTo-Expression | Out-File .\HashTable.ps1

从磁盘反序列化

$HashTable = . .\HashTable.ps1

【讨论】:

FWIW,[System.Management.Automation.PSSerializer]::Serialize() 产生与 Export-Clixml 完全相同的格式

以上是关于PowerShell 是不是支持 HashTable 序列化?的主要内容,如果未能解决你的问题,请参考以下文章

发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner

使用PowerShell 监控运行时间和连接情况

使用Powershell创建新森林,添加第一台域控制器

使用C#+PowerShell进行Windows系统间文件传输

通过启动过程传递变量的Powershell问题

不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )