由于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