PowerShell导出XML有三法:①Export-Clixml用于内部流转,保结构可还原;②ConvertTo-Xml生成标准XML供外部系统用,支持自定义根节点包装;③XmlDocument手动构造,完全控制格式适配API或配置需求。
powershell 中将复杂对象转换为定制 xml 文档,核心在于保留对象结构语义 + 控制序列化方式 + 满足业务或系统对接需求。关键不是“生成任意 xml”,而是让导出的 xml 既可被其他系统(如 .net 应用、配置工具、ci/cd 流水线)可靠解析,又便于后续用 import-clixml 或 convertfrom-xml 重新还原为 powershell 对象。
以下是实用、可控的三步路径:
直接导出为 CliXML(推荐用于 PowerShell 内部流转)
这是最稳妥、语义最完整的方案,专为 PowerShell 对象设计:
Get-Process | Select-Object Name, Id, CPU, WorkingSet | Export-Clixml -Path "processes.clixml"
- ✅ 自动保存类型信息、嵌套属性、集合、方法签名(仅存元数据)
- ✅ 可用
Import-Clixml完全还原为原对象(含属性和结构) - ❌ 不是通用 XML(含 PowerShell 特有命名空间和序列化标记),不适合跨平台或非 PowerShell 系统消费
提示:若需兼容性更强,加
-Depth 5防止深层嵌套被截断(默认深度为 2)
转换为标准 XML(适合外部系统集成)
使用 ConvertTo-Xml 并配合 -As String 和 -Depth 控制输出结构:
$procs = Get-Process | Select-Object Name, Id, CPU | Where-Object { $_.CPU -gt 0 }
$xmlString = $procs | ConvertTo-Xml -As String -Depth 3 -NoTypeInformation
$xmlString | Out-File "procs.xml" -Encoding UTF8- ✅ 输出纯文本 XML,符合 W3C 基本规范,可用浏览器或
Invoke-RestMethod发送 - ✅
-NoTypeInformation去掉<Objs>外层和#type注释,更干净 - ⚠️ 注意:
ConvertTo-Xml默认不支持自定义根节点名或命名空间;如需<Processes><Process>...</Process></Processes>这类结构,需手动包装:
$innerXml = ($procs | ConvertTo-Xml -As String -Depth 2 -NoTypeInformation) -replace '<Objs.*?>|</Objs>', '' "<Processes>$innerXml</Processes>" | Out-File "custom-processes.xml" -Encoding UTF8
手动构造 XML(完全定制,适用于 API/配置场景)
当需要精确控制元素名、属性、命名空间或条件逻辑时,用 System.Xml.XmlDocument:
$xml = New-Object System.Xml.XmlDocument
$root = $xml.CreateElement("Inventory")
$xml.AppendChild($root) | Out-Null
Get-Service | Select-Object Name, Status, StartType | ForEach-Object {
$svcNode = $xml.CreateElement("Service")
$svcNode.SetAttribute("name", $_.Name)
$svcNode.SetAttribute("status", $_.Status.ToString())
$svcNode.SetAttribute("startMode", $_.StartType.ToString())
$root.AppendChild($svcNode) | Out-Null
}
$xml.Save("services-inventory.xml")- ✅ 全面控制格式:属性 vs 子元素、CDATA、注释、缩进(需额外处理)、编码
- ✅ 适合生成配置文件、CI 工件描述、与 Java/.NET 服务对接的 payload
- ❌ 不再是“管道一键导出”,需写逻辑;无法直接用
Import-Clixml还原
不复杂但容易忽略


















