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)
非常感谢。这简单而完美地解决了我的问题。谢谢!这简单而完美地解决了我的问题。