PowerShell XML复制节点位于同一文件中



我正试图在同一文件中复制xml节点,但我收到了错误。请检查。

PowerShell脚本:

$path=".."
cd $path
[xml]$xdoc = Get-Content $path
$NodeToClone = $xdoc.root.Version.Version.Builds.Build.Clone()
$xdoc.DocumentElement.AppendChild($NodeToClone)
$xdoc.Save($path)

XML文件:

<root>
<Versions>
<Version Number="3">
<Builds>
<Build Number="205" Version="30">
<Steps>
<Step Number="1" Build="205" Version="3">
<SubSteps>
<SubStep Number="1" comment="" />
</SubSteps>
</Step>
<Step Number="2" Build="205" Version="3">
<SubSteps>
<SubStep Number="1" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" />
<SubStep Number="2" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" />
</SubSteps>
</Step>
<Step Number="3" Build="205" Version="3">
<SubSteps>
<SubStep Number="1" comment="" />
</SubSteps>
</Step>
</Steps>
</Build>
</Builds>
</Version>
</Versions>
</root>

我想复制下一个编号206的构建节点,但我得到了以下错误:

不能对空值表达式调用方法。在D:\Powershell MyScripts\test.ps1:6 char:48+$NodeToClone=$xdoc.root.Version.Version.Clone<lt<lt;()+CategoryInfo:InvalidOperation:(克隆:字符串)[],RuntimeException+FullyQualifiedErrorId:InvokeMethodOnNull

使用"1"参数调用"AppendChild"时发生异常:"对象引用未设置为对象的实例。"在D:\Powershell MyScripts\test.ps1:7 char:34+$xdoc.DocumentElement.AppendChild<lt<lt;($NodeToClone)+CategoryInfo:未指定:(:)[],MethodInvocationException+FullyQualifiedErrorId:DotNetMethodException

您在XML路径中忘记了一个"s"(…Version.Version…而不是…Version.VVersion…)

$NodeToClone = $xdoc.root.Versions.Version.Builds.Build.Clone()  

此外,您可能希望更改节点以将克隆的节点附加到

$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone)  

否则,它与上一个节点不在同一级别。

评论中讨论后的更新:

[xml]$xdoc = Get-Content $path
$NodeToClone = @($xdoc.root.Versions.Version.Builds.Build)[-1].Clone()  
$NodeToClone.Number = ([int]($NodeToClone.Number) + 1).ToString()
foreach ($step in $NodeToClone.Steps.Step) {
$step.Build = $NodeToClone.Number   
}  
$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone)
$xdoc.Save($path)