Powershell Foreach管道回流类型

Powershell Foreach管道回流类型,powershell,Powershell,我不确定我的标题是否是对我的问题的最好描述。考虑这个最小的工作例子: $arr = @() $object = New-Object -TypeName PSObject $object | Add-Member –MemberType NoteProperty –Name Name –Value "Fred" $object | Add-Member –MemberType NoteProperty –Name Rank –Value "2" $arr += $object $objec

我不确定我的标题是否是对我的问题的最好描述。考虑这个最小的工作例子:

$arr = @()

$object = New-Object -TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name Name –Value "Fred"
$object | Add-Member –MemberType NoteProperty –Name Rank –Value "2"

$arr += $object

$object = New-Object -TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name Name –Value "Joe"
$object | Add-Member –MemberType NoteProperty –Name Rank –Value "1"

$arr += $object

$object = New-Object -TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name Name –Value "Ann"
$object | Add-Member –MemberType NoteProperty –Name Rank –Value "4"

$arr += $object

$arr

($arr | foreach { if($_.Rank -gt 1) { $_ } }).GetType() | FT
($arr | foreach { if($_.Rank -le 1) { $_ } }).GetType() | FT
这个的输出是

Name Rank
---- ----
Fred 2   
Joe  1   
Ann  4   



IsPublic IsSerial Name     BaseType    
-------- -------- ----     --------    
True     True     Object[] System.Array



IsPublic IsSerial Name           BaseType     
-------- -------- ----           --------     
True     False    PSCustomObject System.Object
我的问题存在于尝试对foreach命令的结果数组进行额外处理时。可以想象,$arr的输入数据每次都会不同,匹配结果的数量也会不同。根据匹配结果的数量,数据类型不同我希望这两个函数都返回一个对象数组,但如果只有一个匹配项,则只返回对象。如果我尝试使用计算索引从数组中获取信息,根据它是对象还是对象数组,我将得到截然不同的结果


希望有人能为我找到解决办法!谢谢

@()
环绕表达式:


这将始终产生一个数组。

@()
环绕表达式:


这将始终产生一个数组。

您可以使用
WriteObject
并指定
enumerateCollection
参数,在发出1个或多个对象的任何函数中处理此问题:

function Get-ArrayOfThings
{
    [CmdletBinding()]
    param(
        [ValidateRange(1,100)]
        [int]$Count = 3
    )

    $PSCmdlet.WriteObject(@(1..$Count), $false)
}
(Get-ArrayOfThings -Count 5).GetType() # shows System.Object[]
(Get-ArrayOfThings -Count 1).GetType() # still System.Object[]
或者,您可以在调用方使用数组子表达式强制执行它:

$ArrayOfOneOrMoreThings = @($OneOrMoreThings)

通过使用
WriteObject
并指定
enumerateCollection
参数,您可以在发出1个或多个对象的任何函数中处理此问题:

function Get-ArrayOfThings
{
    [CmdletBinding()]
    param(
        [ValidateRange(1,100)]
        [int]$Count = 3
    )

    $PSCmdlet.WriteObject(@(1..$Count), $false)
}
(Get-ArrayOfThings -Count 5).GetType() # shows System.Object[]
(Get-ArrayOfThings -Count 1).GetType() # still System.Object[]
或者,您可以在调用方使用数组子表达式强制执行它:

$ArrayOfOneOrMoreThings = @($OneOrMoreThings)

非常感谢。这简单而完美地解决了我的问题。谢谢!这简单而完美地解决了我的问题。