SharePoint CSOM PowerShell 不 Return Web.Folders 属性

SharePoint CSOM PowerShell Does Not Return Web.Folders property

这里的目标是访问 Web.Folders 属性 从这个 PowerShell 代码开始。

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

从该列表成员中,我可以看到一个 "Folders" 属性,其中包含以下

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 仅 returns 以下未初始化的消息。

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

不要让这个错误消息让您感到困惑。尽管此错误通常在未从服务器请求客户端对象(文件夹集合)时发生,但在这种特殊情况下,它是由于以下行而发生的:

$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)" 
} 

第一个答案就明白了。这里有一些关于为什么会这样的详细说明。

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

$文件夹

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

在 $folders 的情况下,一些属性 -- 例如 format-default(如错误消息所示)未初始化。因此,当 Powershell 尝试打印出每个 属性 时,它会失败。

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

了解 Powershell 的作用是这里的关键。