PowerShell函数内调用AppendChild方法导致脚本执行失败的原因排查
PowerShell函数内调用AppendChild方法导致脚本执行失败的原因排查
嘿,我来帮你拆解这个让人摸不着头脑的问题!你肯定纳闷:为啥在函数里给Xml节点加个AppendChild,脚本后面就报错了?而且不加这行的时候明明一切正常,加了之后函数里打印的节点类型也没变化啊?
问题的核心原因
其实问题出在PowerShell函数的输出机制上,和AppendChild本身没直接关系:
AppendChild()这个方法执行后,会返回被添加的子节点(也就是你代码里的$desc对象)- 在PowerShell里,函数的输出流会收集所有未被捕获的命令返回值,不光是你用
return明确返回的内容。也就是说,你调用$content.AppendChild($desc)的时候,这个方法的返回值没有被处理,直接就跑到函数的输出流里了 - 这就导致你的
CreateContent函数实际返回的是一个对象数组:第一个元素是$desc(AppendChild的返回值),第二个元素才是你用return返回的$content - 后面的代码(你提到的第33行)应该是把函数返回值当成单个
XmlNode对象来处理了,结果拿到一个数组,自然就报错了
你可以自己验证一下:调用函数后把结果存起来,看看它的类型和长度:
$result = CreateContent Write-Host "返回值类型:$($result.GetType())" Write-Host "返回值长度:$($result.Count)"
你会发现这是一个长度为2的Object数组,而不是你预期的单个XmlNode。
解决办法
只需要把AppendChild的返回值捕获掉,不让它混入函数输出流就行,最简单的方式就是把它重定向到$null:
# 把AppendChild的返回值丢去$null,避免进入输出流 $null = $content.AppendChild($desc)
另外,你代码里尝试的return [System.Xml.XmlNode]$content或者换用Write-Output都没用,因为问题根本不是return的类型,而是函数输出流里多了一个额外的对象。
为啥去掉AppendChild那行就正常?
因为那行代码不存在的时候,函数里只有你用return输出的$content,输出流里只有一个对象,后面的代码能正常处理;加了之后就多了一个AppendChild的返回值,输出流变成数组,后面的代码就懵了。
备注:内容来源于stack exchange,提问作者joseville
相关产品推荐
相关产品推荐

