我确定有这样的理由,但我不知道它是什么。我有以下代码
$Deleted = $Items[0].ParentNode.RemoveChild($Items[0])
Write-Output $Deleted
如果我使用
调用此代码Do-Something -OutVariable Test
我按预期在屏幕和变量中获得输出,但变量是ArraryList
,其中包含XmlElement
类型的单个元素
如果我改为
$Test = Do-Something
我没有按预期在屏幕上获得输出,并且返回的输出是XmlElement
为什么OutVariable
返回ArrayList
而不是返回函数返回的单项?
由于
答案 0 :(得分:4)
v5.1.14393.206(Windows)/ v6.0.0-alpha.15(核心):
PowerShell意外地不用-OutVariable
打开命令的单个 - 对象输出:即使命令仅输出一个对象,该对象也会意外地存储为目标变量中的数组(数组列表),其目标变量的名称将传递给公共参数{ {1}}参数(或其别名,-OutVariable
)。
此外,目标变量中存储的值的类型始终为-ov
,数组列表 ,不一致通过常规作业捕获变量中的多对象输出,从而生成 [System.Collections.ArrayList]
,常规数组
我已提出问题here;在撰写本文时,看起来将被修复(可能在 v6 ),即使它是破解改变。
这是一个简明测试,用于演示问题:
System.Object[]
从上面列出的版本开始,输出:
$null = Get-Date -OutVariable ov; $ov.GetType().FullName
即使输出(概念上)只是单 System.Collections.ArrayList
([datetime]
)实例。
将此与常规作业进行对比:[System.DateTime]
会产生$v = Get-Date; $v.GetType().FullName
。
解决方法是将输出变量引用包装在子表达式运算符( System.DateTime
)中,这样可以提供与常规输出相同的输出(成功)流:
$(...)
数组返回。System.Object[]
当然,如果您只想要一个输出对象,也可以使用# Note the $(...) around $ov
> $null = Get-Date -OutVariable ov; $($ov).GetType().FullName
System.DateTime # 1-element System.Collections.ArrayList unwrapped
。
演示了解决方法对多元素输出也有效:
$ov[0]