gpt4 book ai didi

powershell - 使用 OutVariable 创建 ArrayList

转载 作者:行者123 更新时间:2023-12-05 00:53:53 26 4
gpt4 key购买 nike

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

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

如果我使用调用此代码
Do-Something -OutVariable Test

我按预期在屏幕和变量中得到输出,但变量是 ArraryList具有类型为 XmlElement 的单个元素

如果相反我跑
$Test = Do-Something

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

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

谢谢

最佳答案

从 PowerShell [Core] 7.0 开始:

  • PowerShell 意外地没有解开命令的单对象输出-OutVariable :也就是说,即使一个命令只输出一个对象,该对象也会意外地作为一个数组(数组列表)存储在目标变量中,其名称被传递给公共(public)参数-OutVariable参数(或其别名 -ov )。
  • 此外,存储在目标变量中的值的类型始终为 [System.Collections.ArrayList] , 数组列表 ,即 不一致通过 在变量中捕获多对象输出常规作业 ,结果为 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

    关于powershell - 使用 OutVariable 创建 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40666291/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com