首页 > 解决方案 > 无法弄清楚如何更改 PowerShell 脚本生成的 XML 节点值

问题描述

几年来我一直在涉足 PowerShell,但我从未处理过 XML,而且我很难找到解决我所看到的问题的方法。我已经阅读了各种论坛上的无数线程,我想我承认我对自己想要完成的工作以及其他人在其他线程中解释的内容还不够了解。

我正在编写其他人编写的 PowerShell 脚本,该脚本主要捕获表数据,并将其导出到 XML 文件。正在导出的表数据在其当前状态下可用,但对于某些不是从表派生的值,我需要找到一种简单的方法来更改 XML 节点的名称。

我的 PS 脚本示例是这样的:

$StartDate = [Management.ManagementDateTimeConverter]::ToDateTime($SYSINFO.LastBootUpTime)
$StartDate = "{0:G}" -F $StartDate
$EndDate = "{0:G}" -F (Get-Date)
$UPTIME = New-TimeSpan -Start $StartDate -End $EndDate
# Format Uptime for "DD:HH:MM:SS.MMMM"
$DispTime = "{0:G}" -F $UPTIME
# Remove .MMMM (Milliseconds)
$DispTime = $DispTime.Split('.')[0]
$DispTime = "$DispTime"

$DispTime | ConvertTo-XML -As String | Out-File -LiteralPath (C:\Scripts\ + "Uptime_Status.xml")

我的 XML 输出最终看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object Type="System.String">0:06:56:39</Object>
</Objects>

我需要做的是将<Object Type="System.String">标签更改为其他内容,例如<UPTIME>0:06:56:39</UPTIME>,甚至<Object Type="System.String" Name="Uptime">0:06:56:39</Object>

目标是将节点的名称与其他 XML 标记区分开来,当我使用非表数据时,这些标记会与此相同。我还看到需要重复执行此操作的可能性,因此想知道是否可能还有一个选项,即在整个 XML 文件中自动使用 PS 变量的值作为 XML 节点名称。因此,例如,如果我正在处理 20 条数据,并且我可能将要捕获到 XML 中的值之一的数据标记为$DispTime,也许我还可以有另一个变量,例如$DispTime_NodeName = "Uptime",然后是生成的 XML可能只是:<Uptime>0:06:56:39</Uptime>。所以基本上 PS 脚本必须找到包含“_NodeName”的匹配变量名称,然后使用该值作为 XML 节点名称。我疯了吗?这是不可能的吗?这是我想太多了吗?

非常感谢任何愿意提供帮助的人......我将非常感谢我能得到的任何可靠的帮助。请记住,我还是个新手 :) 哈哈

标签: xmlpowershellnodes

解决方案


对于您问题中的简单示例,您可以从头开始创建自己的 XML 文档:

$xmlDoc = [xml]::new()

# Add declaration
[void]$xmlDoc.AppendChild($xmlDoc.CreateXmlDeclaration('1.0', 'utf-8', $null))

# Add <root> node to document
$root = $xmlDoc.AppendChild($xmlDoc.CreateElement('root'))

# Add <uptime> node to <root>
$uptime = $root.AppendChild($xmlDoc.CreateElement('uptime'))

# Set inner text value on <uptime> node
$uptime.InnerText = $DispTime

# Save document
$xmlDoc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))

如果您想要一种更好的方式来创作 XML 文档,PowerShell Gallery中的Xml模块可能会成功:

安装:

Install-Module Xml

然后:

Import-Module Xml

$doc = New-XDocument root -Version 1.0 -Encoding utf-8 {
    New-XElement uptime {
      $DispTime
    }
}

$doc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))

推荐阅读