SharePoint CSOM PowerShell不返回Web.Folders属性

时间:2016-04-12 23:35:50

标签: powershell csom sharepoint-online

此处的目标是从此PowerShell代码开始访问Web.Folders属性。

Connect-SPOnline –Url https://mysite.sharepoint.com;
$web = Get-SPOWeb;
$web | Get-Member | sort name

从该列表成员中我可以看到"文件夹"属性如下

Definition:
----------                                                                                                                                                  
Microsoft.SharePoint.Client.FolderCollection, 
Microsoft.SharePoint.Client, 
Version=16.1.0.0, 
Culture=neutral, 
PublicKeyToken=71e9bce111e9429c Folders {get;}

因此我应该能够使用以下代码段来检索文件夹属性吗?

$ctx = Get-SPOContext;
$folders = $web.Folders;
$ctx.Load($folders);
$ctx.ExecuteQuery();
$folders;

$folders仅返回以下未经授权的消息。

format-default : The collection has not been initialized. It has not been requested or the request has not been
executed. It may need to be explicitly requested.
    + CategoryInfo          : NotSpecified: (:) [format-default], CollectionNotInitializedException
    + FullyQualifiedErrorId : Microsoft.SharePoint.Client.CollectionNotInitializedException,Microsoft.PowerShell.Comma
   nds.FormatDefaultCommand

2 个答案:

答案 0 :(得分:2)

不要让此错误消息让您感到困惑。即使在服务器未请求客户端对象(文件夹集合)时通常会发生此错误,但在此特定情况下,由于该行而发生此错误:

$folders

因此,正在从服务器正确检索使用指定的代码段文件夹集合:

$web = $ctx.Web
$folders = $web.Folders
$ctx.Load($folders)
$ctx.ExecuteQuery()

为了确定是否已从服务器请求客户端对象或未使用ClientObject.IsObjectPropertyInstantiated method,例如:

if ($web.IsObjectPropertyInstantiated('Folders') -eq $true)
{
   Write-Host "Folder collection has been loaded"
   #... 

}

以下示例演示了如何访问集合中的文件夹及其属性。

示例1.如何迭代文件夹集合并打印其名称:

$folders.GetEnumerator() | % { 
    Write-Host "Folder name: $($_.Name)" 
}

示例2.如何按索引访问文件夹并打印其名称:

if($folders.Count -gt 0){
    $folder = $folders[0] #get first item
    Write-Host "Folder name: $($folder.Name)" 
} 

答案 1 :(得分:2)

第一个答案得到了它。以下是对其原因的更详细说明。

您已正确访问了web.Folder属性。但是,如前面的答案所指出的那样:

$文件夹

是问题所在。这是因为当您将该项目作为命令输入时,Powershell通过打印出项目的每个单一属性来工作。 (Powershell要么使用反射来遍历对象的每个单一属性,要么类似)。

对于$文件夹,某些属性(例如format-default(由错误消息指示))未初始化。因此,当Powershell试图打印出每一个属性时,它都会失败。

因此,一旦初始化了$ folders集合,下一步就是读取特定项目并初始化该项目的属性。

了解Powershell正在做什么是关键。