2013-04-20 3 views
5

У меня странная ситуация с этой функцией PowerShell. Предполагается вернуть объект ArrayList, но в том случае, когда цикл добавляет только 1 элемент в ArrayList, функция возвращает элемент SPList вместо объекта Expected ArrayList. Я сфокусирован на том, почему PowerShell ведет себя так.Функция не возвращает ожидаемый объект

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; 

} 

Это код вызова:

$CORulesResults = Get-ContentOrganizerRules $web.URL; 
        if($CORulesResults.Count -gt 0){ 
         $Results.AddRange($CORulesResults); 
        } 

ответ

6

Там в неявной трубопровод там, и трубопроводы имеют обыкновение «раскатать» массивы, коллекции и ArrayLists один уровень.

Попробуйте это:

return ,$CORules 
+0

'привыкли к« разворачиванию »массивов', что вы имеете в виду? Хотите развернуть, не развернуть, развернуть массивы, что-нибудь еще? – Neolisk

+3

Старый английский. Это означает, что «у них будут все шансы получить». – mjolinor

1

Или вы можете заставить переменную $ CORulesResult в массив с [Array] перед

[Array]$CORulesResults = Get-ContentOrganizerRules $web.URL; 
         if($CORulesResults.Count -gt 0){ 
          $Results.AddRange($CORulesResults); 
         } 
0

У меня была аналогичная проблема, как хорошо, когда я использовал [System. Collections.ArrayList] вместо обычных массивов с фиксированным размером. Возвращаемый объект не был элементом массива, на который я надеялся, но весь массив, и он был бесплодным, за исключением одного элемента, который я хотел вернуть. Поговорите о том, как испортить стек.

Решение было простым: Остановился с помощью [System.Collections.ArrayList]

Вот как вы бы объявить и обрабатывать $ CORules.

$CORules = @() 

... 

$CORules = $CORules + $list 

Viva ле Bash!