我确信发生这种情况是有正当理由的,但我不知道它是什么。我有以下代码
$Deleted = $Items[0].ParentNode.RemoveChild($Items[0])
Write-Output $Deleted
如果我使用调用此代码
Do-Something -OutVariable Test
我按预期在屏幕和变量中得到了输出,但该变量是一个ArraryList
具有类型的单个元素XmlElement
如果我跑
$Test = Do-Something
我没有按预期在屏幕上得到输出,并且返回的输出是单个类型的对象XmlElement
为什么OutVariable
返回一个ArrayList
而不是返回函数返回的单个项目?
Thanks
从 PowerShell(核心)7.3.2 开始:
-
PowerShell 意外地执行了not解开命令的包装single- 对象输出
-OutVariable
:也就是说,即使一个命令只输出one对象,该对象意外地存储为array(数组列表)位于名称传递给公共参数的目标变量中-OutVariable
参数(或其别名,-ov
).
-
此外,存储在目标变量中的值的类型始终是[System.Collections.ArrayList]
, 数组list,即不一致的通过捕获变量中的多对象输出定期分配,这导致System.Object[]
, a regular array.
See GitHub 问题 #3154.
这是一个简洁测试这说明了问题:
$null = Get-Date -OutVariable ov; $ov.GetType().FullName
从上面列出的版本开始,输出:
System.Collections.ArrayList
即使输出(概念上)只是一个single [datetime]
([System.DateTime]
) 实例。
将此与常规作业进行对比:$v = Get-Date; $v.GetType().FullName
yields System.DateTime
.
The 解决方法是将输出变量引用包装在子表达式运算符 ($(...)
),它为您提供与通过常规输出(成功)流相同的输出:
- 单元素集合被展开(仅输出元素本身)
- 多元素集合作为
System.Object[]
array.
# 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)