无法弄清楚如何更改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文件中的XML节点名称。因此,例如,如果我正在处理20个数据,并且我可能将要捕获的值之一的数据标记为XML,例如$DispTime,也许我还可以拥有另一个变量,例如$DispTime_NodeName = "Uptime",然后生成XML可能是:<Uptime>0:06:56:39</Uptime>因此,基本上,PS脚本必须找到包含“ _NodeName”的匹配变量名称,然后使用THAT值作为XML节点名称。我疯了吗?这不可能吗?我在想这个吗?

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

Mathias R. Jessen

对于问题中的简单示例,您可以从头开始创建自己的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"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected].com 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章