8

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);
                    }

3 Answers 3

9

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

Try this:

return ,$CORules
Sign up to request clarification or add additional context in comments.

Comments

2

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);
                        }

Comments

0

I had a similar problem as well, when I used [System.Collections.ArrayList] instead of normal fixed size arrays. The object being returned wasn't the array element I hoped for, but the entire array, and it was barren except for the one element I wanted to return. Talk about messing up the stack.

The solution was simple: Stopped using [System.Collections.ArrayList]

Here's how you would declare and handle $CORules.

$CORules = @()

...

$CORules = $CORules + $list

Viva le Bash!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.