【问题标题】:Using OutVariable Creates ArrayList使用 OutVariable 创建 ArrayList
【发布时间】:2016-11-17 22:34:51
【问题描述】:

我确定发生这种情况是有正当理由的,但我不知道是什么原因。我有以下代码

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

如果我使用

调用此代码
Do-Something -OutVariable Test

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

如果我改为运行

$Test = Do-Something

我没有像预期的那样在屏幕上得到输出,返回的输出是XmlElement类型的单个对象

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

谢谢

【问题讨论】:

    标签: powershell


    【解决方案1】:

    从 PowerShell [Core] 7.0 开始:

    • PowerShell 意外
      -OutVariable
      解开命令的单个对象输出:也就是说,即使如果命令仅输出 one 对象,则该对象意外地存储为目标变量中的 array(数组列表),其名称被传递给公共参数 -OutVariable 参数(或其别名,-ov)。

    • 另外,目标变量中存储的值的类型始终为[System.Collections.ArrayList],一个数组list不一致 strong> 通过正则赋值在变量中捕获多对象输出,从而生成System.Object[],一个正则数组

    this GitHub issue

    这是一个演示问题的简明测试

    $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
    PS> $null = Get-Date -OutVariable ov; $($ov).GetType().FullName
    System.DateTime  # 1-element System.Collections.ArrayList unwrapped
    

    当然,如果您只期望一个输出对象,您也可以使用 $ov[0]

    该变通办法对多元素输出也有效的演示:

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

    【讨论】:

    • 我认为这已在 5.1.14393.2969 stackoverflow.com/questions/56799474/… 中得到修复
    • @Cataster:不,它没有:试试$null = Get-Date -OutVariable ov; $ov.GetType().FullName,你会发现即使是单对象输出仍然存储在[System.Collections.ArrayList] 实例中。
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 2021-11-20
    • 2018-07-09
    • 2019-10-12
    • 2011-10-08
    • 2012-02-25
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多