Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法确定如何更改PowerShell脚本生成的XML节点值_Xml_Powershell_Nodes - Fatal编程技术网

无法确定如何更改PowerShell脚本生成的XML节点值

无法确定如何更改PowerShell脚本生成的XML节点值,xml,powershell,nodes,Xml,Powershell,Nodes,我已经涉猎PowerShell几年了,但我从来没有处理过XML,我很难找到解决我所看到的问题的方法。我在各种论坛上读了无数的帖子,我想我承认我对自己想要完成的事情,或者其他人在其他帖子中解释的事情,理解得不够透彻 我正在编写其他人编写的PowerShell脚本,该脚本主要捕获表数据,并将其导出到XML文件。正在导出的表数据在其当前状态下是可用的,但是对于一些不是从表派生的值,我需要找到一种简单的方法来更改XML节点的名称 我的PS脚本示例如下: $StartDate = [Management.

我已经涉猎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>

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"))