如果我只能检索N个项目,如何使用CSOM从Sharepoint列表中检索所有项目?

时间:2014-08-10 17:50:49

标签: powershell sharepoint csom

我正在编写一个Powershell脚本来检索列表中的所有项目。我的上司告诉我,我一次只能拉200行,所以我记下了以下代码:

function getLookupValues($_ctx, $_listName, $_colToMatch)
{
    $lookupList = $_ctx.Web.Lists.GetByTitle($_listName)
    $query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery(200, 'ID', $_colToMatch)
    $vals = $lookupList.getItems($query)
    $_ctx.Load($lookupList)
    $_ctx.Load($vals)
    $_ctx.ExecuteQuery()

    return $vals
}

我正在测试的列表中有200多个项目。当我运行此代码时,我只检索前200个项目。我认为这是预期的,但我认为,因为查询被称为“所有项目”查询,它可能知道重复查询200个项目,直到它到达列表的末尾。但是,正如我通过测试发现的那样,情况并非如此。

如果每个查询都有N行限制,那么检索列表中每个项目的正确方法是什么?我是否需要执行某种循环,重复查询并将结果转储到保持数组中,直到检索到所有项目为止?

2 个答案:

答案 0 :(得分:4)

Madhur的回答大多是正确的,但我需要一些适用于Sharepoint客户端库的东西。以下是我调整代码以实现所需结果的方法:

$mQueryRowLimit = 200
function getAllListItems($_ctx, $_listName, $_rowLimit = $mQueryRowLimit)
{
    # Load the up list
    $lookupList = $_ctx.Web.Lists.GetByTitle($_listName)
    $_ctx.Load($lookupList)

    # Prepare the query
    $query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $query.ViewXml = "<View>
        <RowLimit>$_rowLimit</RowLimit>
    </View>"

    # An array to hold all of the ListItems
    $items = @()

    # Get Items from the List until we reach the end
    do
    {
        $listItems = $lookupList.getItems($query)
        $_ctx.Load($listItems)
        $_ctx.ExecuteQuery()
        $query.ListItemCollectionPosition = $listItems.ListItemCollectionPosition

        foreach($item in $listItems)
        {
            Try
            {
                # Add each item
                $items += $item
            }
            Catch [System.Exception]
            {
                # This shouldn't happen, but just in case
                Write-Host $_.Exception.Message
            }
        }
    }
    While($query.ListItemCollectionPosition -ne $null)

    return $items
}

答案 1 :(得分:2)

从技术上讲,没有人阻止你一次性检索所有行。如果您看到CreateAllItemsQuery文档,那么会有一个重载来获取所有行

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.client.camlquery.createallitemsquery%28v=office.15%29.aspx

如果每个查询都有N行限制,则必须通过循环检索它。

看看这篇文章: http://blogs.msdn.com/b/kaevans/archive/2012/02/13/iterating-large-sharepoint-lists-with-powershell.aspx

我在这里复制代码:

$web = Get-SPWeb http://portal.sharepoint.com
$list = $web.Lists["LargeList"]

$spQuery = New-Object Microsoft.SharePoint.SPQuery
$spQuery.ViewAttributes = "Scope='Recursive'";
$spQuery.RowLimit = 2000
$caml = '<OrderBy Override="TRUE"><FieldRef Name="ID"/></OrderBy>' 
$spQuery.Query = $caml 

do
{
    $listItems = $list.GetItems($spQuery)
    $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
    foreach($item in $listItems)
    {
        Write-Host $item.Title
    }
}
while ($spQuery.ListItemCollectionPosition -ne $null)