2016-11-18 61 views
1

如果以前已詢問過此問題,請致歉。如果是這樣的話PowerShell將收集對象作爲副本返回

我有建立組成員的對象數組的函數。我可以看到它在函數內工作正常,但返回對象的成員數量恰好是兩倍 - 嘗試了一個ArrayList,這更糟糕。可有人請解釋一下到底是怎麼回事....

function Get-MsolGroupMembers 
    { 


    [CmdletBinding()] 
    param 
    (
    [Parameter(Mandatory=$true, Position=0)] 
    [string] 
    $SearchString 
) 

    $groups = Get-MsolGroup -SearchString $SearchString -MaxResults 1 

    $retObjs = @() 

    Write-Host -fore Yellow $groups.Count 'Group(s) found' 
    foreach ($group in $groups) 
    { 
    $groupGUID = $group.ObjectId 
    $groupDisplayName = $group.DisplayName 
    $groupEmail = $group.EmailAddress 
    $groupType = $group.GroupType 
    $groupMembers = Get-MsolGroupMember -GroupObjectId $groupGUID -All 


    foreach ($groupMember in $groupMembers) 
    { 
     $Properties = @{"GroupDisplayName"=$groupDisplayName; 
     "GroupEmail"=$grouEmail; 
     "GroupType"=$groupType; 
     "MemberDisplayName"=$groupMember.DisplayName; 
     "MemberEmail"=$groupMember.EmailAddress; 
     "MemberType"=$groupMember.GroupMemberType} 

     $Obj = New-Object -TypeName PSObject -Property $Properties 
     Write-Output $Obj | select GroupDisplayName,GroupEmail,GroupType,MemberDisplayName,MemberEmail,MemberType 

     $retObjs += $Obj 
    } 

    return $reObjs; 
    } 

}

$members = Get-MsolGroupMembers -SearchString 'My Test Group' 
$members.Count 

回答

2

當然,這很容易。你輸出所有東西兩次。一旦與Write-Output一行,然後再與return一行。 PowerShell函數返回任何未專門重定向的流水線(例如使用Write-HostExport-Csv),因此這兩個命令基本上都會執行相同的操作,這就是倍增來源。刪除一個或另一個,你會全部設置。

+0

謝謝,我可以刪除尾隨返回,但仍然將我的集合傳遞迴調用腳本。 – westerdaled

+0

是的,當函數輸出時,集合仍然展開,所以它不會有任何區別。 – TheMadTechnician

+0

謝謝,我有點困惑,因爲我認爲寫對象只是處理每個對象的內部人口。感謝您糾正我 – westerdaled