0

在SharePoint 2013上,我嘗試使用客戶端SharePoint PowerShell獲取列表項。 即使對於字段ID或標題,我遇到此錯誤:該集合尚未初始化。 我不知道如何包含字段。我在C#或JavaScript中找到很多例子,但在客戶端PowerShell中沒有。客戶端SharePoint PowerShell - 獲取列表項 - 集合尚未初始化

這裏是我的代碼(它返回項目的正確的號碼):

Function New-Context([String]$WebUrl) { 
    $context = New-Object Microsoft.SharePoint.Client.ClientContext($WebUrl) 
    $context.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials 
    $context 
} 

Function Get-List([Microsoft.SharePoint.Client.ClientContext]$Context, [String]$ListTitle) { 
    $list = $context.Web.Lists.GetByTitle($ListTitle) 
    $context.Load($list) 
    $context.ExecuteQuery() 
    $list 
} 

$context = New-Context -WebUrl "http://mysharepoint.com/sites/qp" 
$list = Get-List -Context $context -ListTitle "QP-Configuration" 

$query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery() 
$items = $list.GetItems($query) 
$context.Load($items) 
$context.ExecuteQuery() 

$items.Count 
$items[0] 

foreach($item in $items) 
{ 
    $item.Id 
} 

$context.Dispose() 
+2

請張貼完整的錯誤,包括行號等 –

+0

完整的錯誤不是你嘗試訪問一個項目($ items [0]或在foreach中) 'format-default:集合尚未初始化。它沒有被請求或者請求沒有被執行。可能需要明確要求。 + CategoryInfo:NotSpecified:(:) [格式默認],CollectionNotInitializedException + FullyQualifiedErrorId:Microsoft.SharePoint.Client.CollectionNotInitializedException,Microsoft.PowerShell.Commands.FormatDefaultCommand' – Cyril

回答

-1

錯誤是試圖讓這樣的完整的項目:使用$item.Title$items[0]或列值,而不是$item["Title"]

正確的代碼是:

#Import the required DLL 
Add-Type -Path 'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll' 

Function New-Context([String]$WebUrl) { 
    $context = New-Object Microsoft.SharePoint.Client.ClientContext($WebUrl) 
    $context.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials 
    $context 
} 

Function Get-List([Microsoft.SharePoint.Client.ClientContext]$Context, [String]$ListTitle) { 
    $list = $context.Web.Lists.GetByTitle($ListTitle) 
    $context.Load($list) 
    $context.ExecuteQuery() 
    $list 
} 

$context = New-Context -WebUrl "http://mysharepointsite.com/sites/qp" 
$list = Get-List -Context $context -ListTitle "QP-Configuration" 

$query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery() 
$items = $list.GetItems($query) 
$context.Load($items) 
$context.ExecuteQuery() 

$items.Count 

foreach($item in $items) 
{ 
    $item["Title"] 
} 

$context.Dispose() 
+0

這是一個僞命題:_it了由你如何定義引起在function_中是可變的,如果你使用函數或者不使用函數,它是無關的。就像在我提供的答案中提到的,它與如何在PowerShell中訪問對象屬性有關。 –

+0

如果它與該功能無關,爲什麼它沒有這個功能呢?有問題的函數是Get-List – Cyril

+0

不,它不是函數,試圖找回表達式'$ items [0]'並且會出現相同的錯誤 –

0

雖然在行得到一個特定的列表項的指標:

$items[0]

或通過Microsoft.SharePoint.Client.ListItemCollection集合迭代:

foreach($item in $items) 
{ 
    #... 
} 

對象的每個屬性在PowerShell中擺出初始化,但是這不符合Microsoft.SharePoint.Client.ListItem,因爲只有屬性的特定子集可以是這樣的檢索和這個錯誤發生的原因。

要檢索列表項的值,我建議通過ListItem.FieldValues屬性來訪問它們:

#get list items values 
$dataValues = @() 
$items.GetEnumerator() | % { 
    $dataValues += $_.FieldValues 
} 

$query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery() 
$items = $list.GetItems($query) 
$context.Load($items) 
$context.ExecuteQuery() 

$dataValues = @() 
$items.GetEnumerator() | % { 
    $dataValues += $_.FieldValues 
} 

$dataValues.Count #determine the amount of items 
$dataValues[0] #access item by index 

#iterate through list items and print a specific field value, for example FileRef 
foreach($item in $dataValues) 
{ 
    $item.FileRef 
} 
+0

這樣的方式獲得像$ items [0]或列值的完整項目。 – Cyril