无法确定如何更改PowerShell脚本生成的XML节点值
我已经涉猎PowerShell几年了,但我从来没有处理过XML,我很难找到解决我所看到的问题的方法。我在各种论坛上读了无数的帖子,我想我承认我对自己想要完成的事情,或者其他人在其他帖子中解释的事情,理解得不够透彻 我正在编写其他人编写的PowerShell脚本,该脚本主要捕获表数据,并将其导出到XML文件。正在导出的表数据在其当前状态下是可用的,但是对于一些不是从表派生的值,我需要找到一种简单的方法来更改XML节点的名称 我的PS脚本示例如下:无法确定如何更改PowerShell脚本生成的XML节点值,xml,powershell,nodes,Xml,Powershell,Nodes,我已经涉猎PowerShell几年了,但我从来没有处理过XML,我很难找到解决我所看到的问题的方法。我在各种论坛上读了无数的帖子,我想我承认我对自己想要完成的事情,或者其他人在其他帖子中解释的事情,理解得不够透彻 我正在编写其他人编写的PowerShell脚本,该脚本主要捕获表数据,并将其导出到XML文件。正在导出的表数据在其当前状态下是可用的,但是对于一些不是从表派生的值,我需要找到一种简单的方法来更改XML节点的名称 我的PS脚本示例如下: $StartDate = [Management.
$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>
0:06:56:39
我需要做的是将
标记更改为其他标记,例如0:06:56:39
,或者甚至0:06:56:39
目标是将节点的名称与其他XML标记区分开来,当我使用非表数据时,这些XML标记与此相同。我还看到可能需要重复这样做,因此我想知道是否也可能有一个选项,即在整个XML文件中自动使用PS变量的值作为XML节点名。例如,如果我处理20条数据,我可能会将要捕获到XML中的某个值的数据标记为$DispTime
,也许我还可以使用另一个变量,如$DispTime\u NodeName=“Uptime”
,然后生成的XML可能就是:0:06:56:39
。因此,PS脚本基本上必须找到包含“_NodeName”的匹配变量名,然后使用该值作为XML节点名。我疯了吗?这不可能吗?我是不是想得太多了
非常感谢任何愿意帮忙的人。。。。如果能得到任何切实的帮助,我将不胜感激。请记住,我在这方面还是个新手:)哈哈对于您问题中的简单示例,您可以从头开始创建自己的XML文档:
$xmlDoc=[xml]::new()
#添加声明
[void]$xmlDoc.AppendChild($xmlDoc.CreateXmlDeclaration('1.0','utf-8',$null))
#将节点添加到文档
$root=$xmlDoc.AppendChild($xmlDoc.CreateElement('root'))
#将节点添加到
$uptime=$root.AppendChild($xmlDoc.CreateElement('uptime'))
#在节点上设置内部文本值
$uptime.InnerText=$DispTime
#保存文档
$xmlDoc.Save((连接路径C:\Scripts“Uptime\u Status.xml”))
如果您想要一种更好的XML文档创作方式,off-of-PowerShell Gallery可能会起到以下作用: 安装时使用:
Install-Module Xml
然后:
嗨,马西亚斯!非常感谢你的帮助!因此,我尝试了您提供的第一个建议,但不幸的是,我最终遇到了以下错误,我不知道如何解决:使用“1”参数调用“AppendChild”时出现异常:“此文档已经有一个“DocumentElement”节点。”位于C:\Scripts\health\u monitoring\xml\u test\u 1.ps1:51 char:1+$uptime=$xmlDoc.AppendChild($xmlDoc.CreateElement(“正常运行时间”)+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:未指定:(:)[],MethodInvocationException+FullyQualifiedErrorId:DotNetMethodException在该对象上找不到属性“InnerText”。请验证该属性是否存在以及是否可以设置。位于C:\Scripts\health\u monitoring\xml\u test\u 1.ps1:54 char:1+$uptime.InnerText=$DispTime+~~~~~~~~~~~~~~~~~~~~~~~类别信息:InvalidOperati在:(:)[],RuntimeException+FullyQualifiedErrorId:PropertyAssignmentException@Andrew我的答案中有一个拼写错误,现在已经修复:)第二个建议的唯一问题是脚本将在大量现有服务器上使用,因此安装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"))