确保管道总是导致数组而不使用@()?

时间:2015-07-10 14:22:44

标签: arrays powershell pipeline

有没有什么好方法可以确保管道结果始终是没有数组文字@()的数组?

目前,我总是发现自己编写管道并假设结果是一个数组,例如

$Results = $ResultFiles | Where Name -like $Pattern | Sort -Unique Name

# Processing that assume $Results is array, e.g.
Out-Host -InputObject "found $($Results.Length) matching files..."

# Further processing that assume $Results is array

然后,我意识到我需要确保$Results始终是一个数组。所以,我回过头来添加前面的魔术@()@(和后面的)

$Results = @( <pipeline_statement> )
通过添加到空数组

,甚至更神奇
$Results = @() + <pipeline_statement>


我的问题:有没有办法确保管道总是产生一个数组?这不需要“魔术”@()?我想创建一个收集管道结果的函数,例如ConvertTo-Array,如:

$Results = <pipeline_statement> | ConvertTo-Array

但我宁愿使用默认的Cmdlet或惯用语。


注意: 我也试图创建ConvertTo-CustomObject,因为我经常发现自己从哈希表创建PSCustomObject

1 个答案:

答案 0 :(得分:3)

是的,有。能够直接将单个值强制转换为数组。如果该值已经是[Object[]],则无法有效更改。

[Array]$result=<pipeline_statement>

如@wannabeprogrammer的评论中所述,这不会将null值转换为数组。如果某些东西可以返回null,则以下添加将解决这种情况:

if ($result -eq $null) { $result = @() }