在PowerShell中如何将哈希表导出为XML

PowerShell中Export-Clixml不能导出标准XML,仅支持PowerShell专用序列化格式;如需跨语言交互,须先转PSCustomObject再用ConvertTo-Xml。

PowerShell 中不能直接用 Export-Clixml 导出纯哈希表(System.Collections.Hashtable)为“标准 XML 文件”,因为该 cmdlet 实际上序列化的是对象的完整 .NET 对象图(含类型信息、私有字段等),生成的是 PowerShell 专用的二进制兼容 XML 格式,不是通用可读的结构化 XML(如 `Value`)。但你可以按需选择两种路径:

导出为 PowerShell 原生序列化 XML(推荐用于 PowerShell 环境间交换)

这是最简单、最可靠的方式,适用于后续仍用 PowerShell 读取的场景:

  • 使用 Export-Clixml 直接导出哈希表,它会保留所有键值对、嵌套结构和数据类型(如数字、布尔、数组)
  • 导出后可用 Import-Clixml 完整还原为原始哈希表,包括嵌套哈希表或数组
  • 示例:
    $hash = @{Name='Alice'; Age=30; IsActive=$true; Tags=@('Admin','Dev')}
    $hash | Export-Clixml -Path "config.xml"
    $restored = Import-Clixml -Path "config.xml"

导出为通用可读的结构化 XML(如用于配置、跨语言交互)

PowerShell 没有内置 cmdlet 直接将哈希表“美化”成语义清晰的 XML,需手动构造。常用方法是先转为自定义对象(PSCustomObject),再用 ConvertTo-Xml

  • ConvertTo-Xml 默认只接受对象(不支持直接传哈希表),所以需先包装:
    $hash = @{Server='web01'; Port=443; SSL=$true}
    [PSCustomObject]$hash | ConvertTo-Xml -NoTypeInformation | Select-Object -ExpandProperty OuterXml
  • 输出类似:
    web01443True
  • 若需更简洁格式(如根节点叫 Config),可进一步用 [xml] 类型强制转换 + 手动重组节点,或借助 System.Xml.XmlDocument 构建

注意:哈希表键名的限制

无论哪种方式,哈希表的键名都会影响 XML 输出质量:

  • 键名不能含空格、点号、连字符等特殊字符(否则 ConvertTo-Xml 可能报错或生成非法 XML 属性名)
  • 建议统一用 PascalCase 或 camelCase 键名,例如 UserName 而非 User Nameuser-name
  • 若必须保留特殊字符键,先重命名再导出,或改用 JSON(ConvertTo-Json)作为替代方案

小结:选哪种?

如果目标是 PowerShell 内部持久化或传输——用 Export-Clixml
如果目标是人可读、被其他系统(如 C#、Python)解析——先转 PSCustomObject,再用 ConvertTo-Xml,必要时配合 XML DOM 手动优化结构。