求兼容PowerShell 3.0的多cmdlets输出转自定义XML实现方案
兼容PowerShell 3.0的自定义XML生成方案
PowerShell 3.0原生完整支持System.Xml命名空间的所有操作,完全可以实现自定义XML结构、编码、节点格式的全控制,不需要依赖PowerShell 4.0专属特性,可在Windows Server 2008 SP1环境正常运行。
具体实现步骤
- 第一步:初始化XML文档基础结构
# 创建空XML文档对象 $xmlDoc = New-Object System.Xml.XmlDocument # 声明XML版本和编码规则 $xmlDeclaration = $xmlDoc.CreateXmlDeclaration("1.0", "utf-8", $null) $xmlDoc.AppendChild($xmlDeclaration) | Out-Null # 创建自定义根节点,可根据需求修改节点名 $rootNode = $xmlDoc.CreateElement("DomainControllerAuditData") $xmlDoc.AppendChild($rootNode) | Out-Null
- 第二步:添加从cmdlet获取的DC数据节点
示例为插入域控制器基础信息,可根据你需要提取的指标自由扩展节点、属性:
# 替换为你实际用到的DC信息查询cmdlet $dcList = Get-ADDomainController -Filter * foreach ($dc in $dcList) { # 创建单个DC的父节点 $dcItemNode = $xmlDoc.CreateElement("DCItem") # 给节点添加自定义属性 $dcItemNode.SetAttribute("HostName", $dc.HostName) $dcItemNode.SetAttribute("Site", $dc.Site) $dcItemNode.SetAttribute("IPv4", $dc.IPv4Address) # 可选:添加子节点存储更多信息 $osNode = $xmlDoc.CreateElement("OperatingSystem") $osNode.InnerText = $dc.OperatingSystem $dcItemNode.AppendChild($osNode) | Out-Null $statusNode = $xmlDoc.CreateElement("Status") $statusNode.InnerText = $dc.OperatingSystemStatus $dcItemNode.AppendChild($statusNode) | Out-Null # 将当前DC节点挂载到根节点 $rootNode.AppendChild($dcItemNode) | Out-Null }
- 第三步:格式化输出XML文件
支持自定义缩进、换行等展示格式:
# 配置输出格式参数 $xmlSaveSettings = New-Object System.Xml.XmlWriterSettings $xmlSaveSettings.Indent = $true $xmlSaveSettings.IndentChars = " " # 缩进用2个空格,可自行修改 $xmlSaveSettings.OmitXmlDeclaration = $false $xmlSaveSettings.NewLineOnAttributes = $false # 可改为true实现每个属性单独换行 # 导出文件,替换为你需要的保存路径 $xmlWriter = [System.Xml.XmlWriter]::Create("C:\DC_Audit_Result.xml", $xmlSaveSettings) $xmlDoc.WriteTo($xmlWriter) $xmlWriter.Flush() $xmlWriter.Close()
适配原高版本脚本的替换规则
如果你想复用参考指南里的已有逻辑,只需要将其中PowerShell 4.0专属语法替换为3.0兼容写法即可:
- 将方法式筛选
$array.Where({条件})替换为管道筛选$array | Where-Object {条件} - 将方法式遍历
$array.ForEach({逻辑})替换为标准foreach循环foreach ($item in $array) {逻辑} - 所有
System.Xml相关的API调用无需修改,PowerShell 3.0完全支持
内容的提问来源于stack exchange,提问作者Nad
相关产品推荐
相关产品推荐

