Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function not returning expected object

Tags:

powershell

I have a strange situation with this PowerShell function. It is suppose to return the ArrayList object but in the case when the loop only adds 1 item to the ArrayList the function returns the SPList item instead of the Expected ArrayList object. I am stumped on why PowerShell is behaving this way.

function Get-ContentOrganizerRules
(
    [System.String]$siteUrl = "http://some.sharepoint.url"

)
{
    Write-Host -ForegroundColor Gray "Searching for Content Organizer Rules: "  $siteUrl


    # ArrayList to hold any found DataConn Libs
    [System.Collections.ArrayList]$CORules = New-Object System.Collections.ArrayList($null)


    $lists = Get-SPWeb $siteUrl |
        Select -ExpandProperty Lists |
        Where { $_.GetType().Name -eq "SPList" -and  $_.hidden }

    foreach($list in $lists)
    {
        #Write-Host $list ;

        foreach($contenType in $list.ContentTypes){
            if($contenType -ne $null){
                if($contenType.Id.ToString() -eq "0x0100DC2417D125A4489CA59DCC70E3F152B2000C65439F6CABB14AB9C55083A32BCE9C" -and $contenType.Name -eq "Rule")
                {
                    $CORules.Add($list)>$null;
                    Write-Host -BackgroundColor Green -ForegroundColor White "Content Organizer Rule found: " $list.Url>$null;
                }
            }
        }
    }

    return $CORules;

}

This is the calling code:

$CORulesResults = Get-ContentOrganizerRules $web.URL;
                    if($CORulesResults.Count -gt 0){
                        $Results.AddRange($CORulesResults);
                    }
like image 695
ChiliYago Avatar asked Apr 20 '13 15:04

ChiliYago


2 Answers

There's a implicit pipeline there, and pipelines tend to "unroll" arrays, collections and arraylists one level.

Try this:

return ,$CORules
like image 151
mjolinor Avatar answered Nov 08 '22 01:11

mjolinor


Or you can force the variable $CORulesResult to an Array with [Array] in front

[Array]$CORulesResults = Get-ContentOrganizerRules $web.URL;
                        if($CORulesResults.Count -gt 0){
                            $Results.AddRange($CORulesResults);
                        }
like image 2
Solaflex Avatar answered Nov 08 '22 01:11

Solaflex