使用OutVariable创建ArrayList

时间:2016-11-17 22:34:51

标签: powershell

我确定有这样的理由,但我不知道它是什么。我有以下代码

$Deleted = $Items[0].ParentNode.RemoveChild($Items[0])
Write-Output $Deleted

如果我使用

调用此代码
Do-Something -OutVariable Test

我按预期在屏幕和变量中获得输出,但变量是ArraryList,其中包含XmlElement类型的单个元素

如果我改为

$Test = Do-Something

我没有按预期在屏幕上获得输出,并且返回的输出是XmlElement

类型的单个对象

为什么OutVariable返回ArrayList而不是返回函数返回的单项?

由于

1 个答案:

答案 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]