2016-04-12 2 views
1

Целью здесь является доступ к свойству Web.Folders, начиная с этого кода PowerShell.SharePoint CSOM 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;} 

как таковой should'nt я смогу извлечь в папки Собственость, используя следующий фрагмент кода?

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

$folders только возвращает следующее uninitilized сообщение.

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

Не позволяйте этому сообщению об ошибке ввести вас в замешательство. Даже если эта ошибка обычно возникает, когда объект клиента (сбор папки) не был запрошен с сервера, в данном случае это происходит из-за линии:

$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

Первый ответ получает его , Вот еще несколько подробностей о том, почему это так.

У вас есть свойство web.Folder правильно. Однако, как и предыдущий ответ указывает, линию:

$ скоросшиватели

проблема. Это потому, что Powershell работает, распечатывая свойство EVERY SINGLE элемента, когда вы вводите этот элемент в качестве команды. (Powershell использует рефлексию для прохождения КАЖДОЙ ОДНОЙ СОБСТВЕННОСТИ объекта или чего-то подобного).

В случае $ папок некоторые свойства, такие как формат по умолчанию (как указано сообщением об ошибке), не инициализируются. Поэтому, когда Powershell пытается распечатать каждое свойство, он терпит неудачу.

Итак, как только вы инициализировали коллекцию $ folders, следующим шагом будет чтение определенного элемента и инициализация свойств этого элемента.

Понимание того, что делает Powershell, является ключевым здесь.

Смежные вопросы