此处的目标是从此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
答案 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正在做什么是关键。