【问题标题】:Function not returning expected object函数未返回预期对象
【发布时间】:2020-10-10 05:08:25
【问题描述】:

我对这个 PowerShell 函数有一个奇怪的情况。假设返回 ArrayList 对象,但在循环仅向 ArrayList 添加 1 个项目的情况下,函数返回 SPList 项目而不是预期的 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);
                    }

【问题讨论】:

    标签: powershell


    【解决方案1】:

    那里有一个隐式管道,管道倾向于将数组、集合和数组列表“展开”一层。

    试试这个:

    return ,$CORules
    

    【讨论】:

      【解决方案2】:

      或者您可以将变量 $CORulesResult 强制转换为前面带有 [Array] 的数组

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

      【讨论】:

        【解决方案3】:

        当我使用 [System.Collections.ArrayList] 而不是普通的固定大小数组时,我也遇到了类似的问题。返回的对象不是我希望的数组元素,而是整个数组,除了我想返回的一个元素外,它是贫瘠的。谈论搞砸堆栈。

        解决方案很简单:停止使用 [System.Collections.ArrayList]

        以下是声明和处理 $CORules 的方式。

        $CORules = @()
        
        ...
        
        $CORules = $CORules + $list
        

        Viva le Bash

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-15
          • 2012-01-21
          • 2019-10-27
          • 2018-12-16
          • 2013-04-02
          • 2012-08-16
          • 1970-01-01
          相关资源
          最近更新 更多