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 的作用是这里的关键。
这里的目标是访问 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 的作用是这里的关键。