2016-11-17 84 views
2

我确信有一个有效的原因,为什么发生这种情况,但我不知道它是什么。我有以下代码使用OutVariable创建ArrayList

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

如果我打电话使用

Do-Something -OutVariable Test 

我得到的屏幕上,由可变输出如预期该代码,但变量是ArraryList与单个元素类型为XmlElement

如果相反,我跑

$Test = Do-Something 

我没有得到屏幕上的输出,符合市场预期,返回的输出类型的单个对象XmlElement

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

感谢

回答

3

由于v5.1.14393.206的(Windows)中/ V6.0.0-alpha.15(核心):

  • PowerShell的意外确实解开一个命令的对象输出与-OutVariable即:即使命令只输出一个对象,该对象意外存储为阵列(数组列表)将其名称传递给通用参数-OutVariable参数(或其别名,-ov)的目标变量中。

  • 另外,类型存储在目标变量的值始终是[System.Collections.ArrayList],阵列列表,这是不一致与由定期分配,捕获多对象输出在一个变量,它结果为System.Object[],a 常规 array

我提交了一个问题here;截至记者发稿,它看起来像这样将(在V6大概)固定,即使它是一个打破变化。

这里的一个简明测试演示该问题:

$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]如果你只指望一个单一的输出对象。

的演示,该解决方法是用多元件输出太有效:

> $null = Get-ChildItem/-OutVariable ov; $($ov).GetType().FullName 
System.Object[] # multi-element System.Collections.ArrayList converted to array