2016-09-29 2 views
1

Моя цель: Получить элементы в папках в библиотеке SharePoint 2010. Я пытаюсь получить некоторые элементы из библиотеки SharePoint 2010 с помощью CSOM с PowerShell. Я пробовал три разных метода, которые я нашел в Интернете, но все же безуспешно. Кроме того, документация Microsoft в этом аспекте, в первую очередь, такова, надеюсь, что кто-то может мне помочь. Так вот мы идем:Загрузите элементы библиотеки SharePoint 2010 с помощью PowerShell V2 с CSOM

1.Method

  [Microsoft.SharePoint.Client.FileInformation]$fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $file.ServerRelativeUrl); 
      [System.IO.FileStream]$writeStream = [System.IO.File]::Open("$($libraryTargetPath)\$($file.Name)", [System.IO.FileMode]::Create); 
      $fileInfo.Stream.CopyTo($writeStream); 
      $writeStream.Close(); 

С помощью метода Я получаю эту ошибку:

Метод вызова не удалось, потому что [System.Net.ConnectStream] не содержит метода с именем «CopyTo».
+ $ fileInfo.Stream.CopyTo < < < < ($ writeStream);
+ CategoryInfo: InvalidOperation: (CopyTo: String) [], RuntimeException
+ FullyQualifiedErrorId: MethodNotFound

код [System.Net.ConnectStream] не может найти метод CopyTo
Я был lookign информация о это, в пространстве имен System.Net и в классе "Microsoft.SharePoint.Client.FileInformation", но без успеха :(

2.MethodB

  $binary = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $file.ServerRelativeUrl) 
      $Action = [System.IO.FileMode]::Create 
      $new = "$($libraryTargetPath)\$($file.Name)" 
      $stream = New-Object System.IO.FileStream $new, $Action 
      $writer = New-Object System.IO.BinaryWriter($stream) 
      $writer.write($binary) 
      $writer.Close() 

Метод B не дает мне ошибку, но вместо загрузки деталей, это делает пустые файлы в папке назначения. Таким образом, этот метод не загружает элементы, просто создавая новые файлы.

3.MethodC

  $binary = $file.OpenBinary() 
      $stream = New-Object System.IO.FileStream("$($libraryTargetPath)\$($file.Name)"), Create 
      $writer = New-Object System.IO.BinaryWriter($stream) 
      $writer.write($binary) 
      $writer.Close() 

Я не уверен, если метод C принадлежит CSOM или к SharPoint встроенной стороне сервера клиента, если это так, пожалуйста, дайте мне знать, , Это ошибка, которую я получаю:

Ошибка вызова метода, поскольку [Microsoft.SharePoint.Client.File] не содержит метода с именем «OpenBinary». В C: \ Users \ Administrator \ Desktop \ SharePointOnPremisesBackUp \ SharePointOnPremisesBackUp.ps1: 77 символ: 31
+ $ двоичным = $ file.OpenBinary < < < <()
+ CategoryInfo: InvalidOperation: (OpenBinary: String) [ ], RuntimeException
+ FullyQualifiedErrorId: MethodNotFound

и здесь PowerShell не может найти OpenBinary() метод в Microsoft.SharePoint.Client.File и там почти нет информации об этом методе.

Здесь полная функция, которую я пытаюсь использовать:

function GetDocumentLibs ($ctx, $web) 
{ 
    Function IterateFoldersRecursively([Microsoft.SharePoint.Client.Folder]$folder, [Microsoft.SharePoint.Client.ClientContext]$ctx) 
    { 
     # make sure that the "Web.Context.Url" is the current web url 
     if ($web.Context.Url.StartsWith($SiteCollectionUrl) -eq $true) 
     { 
     $files = $folder.Files 
     $ctx.Load($folder.Files) 
     $ctx.Load($folder.Folders) 
     $ctx.ExecuteQuery() 

     foreach ($subFolder in $folder.Folders) 
     { 
      IterateFoldersRecursively $subFolder $ctx 
     } 

     # Check if folder Exist and Skip 

     $libraryTargetPath = "$($TargetPath)\$($folder.ServerRelativeUrl.Replace('/', '\'))" 
     New-Item -Path $libraryTargetPath -ItemType Directory -Force 

      foreach ($file in $files) 
      { 
      # Method 1 
      [Microsoft.SharePoint.Client.FileInformation]$fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $file.ServerRelativeUrl); 
      [System.IO.FileStream]$writeStream = [System.IO.File]::Open("$($libraryTargetPath)\$($file.Name)", [System.IO.FileMode]::Create); 
      $fileInfo.Stream.CopyTo($writeStream) 
      $writeStream.Close() 

      # Method 2 
      $binary = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $file.ServerRelativeUrl) 
      $Action = [System.IO.FileMode]::Create 
      $new = "$($libraryTargetPath)\$($file.Name)" 
      $stream = New-Object System.IO.FileStream $new, $Action 
      $writer = New-Object System.IO.BinaryWriter($stream) 
      $writer.write($binary) 
      $writer.Close() 

      # Method 3 
      $binary = $file.OpenBinary() 
      $stream = New-Object System.IO.FileStream("$($libraryTargetPath)\$($file.Name)"), Create 
      $writer = New-Object System.IO.BinaryWriter($stream) 
      $writer.write($binary) 
      $writer.Close() 

      # delete folder 
      } 
     } 
    } 
    $folder = $web.GetFolderByServerRelativeUrl($web.ServerRelativeUrl) 
    $ctx.Load($folder) 
    $ctx.ExecuteQuery() 

    IterateFoldersRecursively $folder $ctx 
}            

инструменты я использую:

  1. Sapien в PowerShell Студия
  2. PowerShell V2 с CSOM
  3. SharePoint 2010 OnPremises

Пожалуйста, если у вас есть какое-либо решение, ссылка, документация или учебник, которые могут быть полезны, скажите мне. Заранее спасибо.

ответ

1

После долгих исследований я нашел решение и решил использовать этот метод:

function GetDocumentLibs ($ctx, $web) 
{ 
    $site = $ctx.Site 
    $ctx.Load($site) 
    $ctx.ExecuteQuery() 
    $siteUrl = $site.Url 

    Function IterateFoldersRecursively([Microsoft.SharePoint.Client.Folder]$folder, [Microsoft.SharePoint.Client.ClientContext]$ctx) 
    { 
     if ($web.Context.Url.StartsWith($SiteCollectionUrl) -eq $true) 
     { 
      $files = $folder.Files 
      $ctx.Load($folder.Files) 
      $ctx.Load($folder.Folders) 
      $ctx.ExecuteQuery() 

      foreach ($subFolder in $folder.Folders) 
      { 
       IterateFoldersRecursively $subFolder $ctx 
      } 

      $targetPath = "$($TargetPath)\$($folder.ServerRelativeUrl.Replace('/', '\'))" 
      New-Item -Path $targetPath -ItemType Directory -Force 

      foreach ($file in $files) 
      { 
       $client = new-object System.Net.WebClient 
       $client.UseDefaultCredentials = $true 
       $client.DownloadFile("$($siteUrl)$($file.ServerRelativeUrl)", "$($targetPath)\$($file.Name)") 
      } 
     } 
    } 
    $folder = $web.GetFolderByServerRelativeUrl($web.ServerRelativeUrl) 
    $ctx.Load($folder) 
    $ctx.ExecuteQuery() 

    IterateFoldersRecursively $folder $ctx 
} 

Запомнить реализовать некоторые обработки исключений. Надеюсь, это поможет кому-то с той же проблемой.

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