我正在编写一个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行限制,那么检索列表中每个项目的正确方法是什么?我是否需要执行某种循环,重复查询并将结果转储到保持数组中,直到检索到所有项目为止?
答案 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
文档,那么会有一个重载来获取所有行
如果每个查询都有N行限制,则必须通过循环检索它。
我在这里复制代码:
$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)