2016-09-29 2 views
1

Mein Ziel ist: Holen Sie die Elemente in den Ordnern in einer SharePoint 2010-Bibliothek. Ich habe Probleme, einige Elemente aus einer SharePoint 2010-Bibliothek mithilfe von CSOM mit PowerShell zu erhalten. Ich habe drei verschiedene Methoden ausprobiert, die ich im Internet gefunden habe, aber immer noch ohne Erfolg. Auch die Microsoft-Dokumentation ist wirklich in diesem Aspekt, hoffentlich kann mir jemand helfen. So hier gehen wir:Download SharePoint 2010-Bibliothekselemente mit PowerShell V2 mit CSOM

1.VerfahrenA

  [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(); 

Mit dem A Methode, die ich diesen Fehler:

Methodenaufruf ist fehlgeschlagen, da [System.Net.ConnectStream] enthält keine Methode mit dem Namen 'CopyTo'.
+ $ fileInfo.Stream.CopyTo < < < < ($ writeStream);
+ CategoryInfo: InvalidOperation: (CopyTo: String) [], Runtime
+ FullyQualifiedErrorId: MethodNotFound

Die [System.Net.ConnectStream] kann die Methode CopyTo nicht finden
Ich war lookign Informationen über dies, in dem System.Net-Namespace und in der "Microsoft.SharePoint.Client.FileInformation" Klasse, aber ohne Erfolg :(

2.VerfahrenB

  $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() 

Methode B Sie mir nicht einen Fehler geben, aber anstatt die Artikel herunterzuladen, macht es leere Dateien im Zielordner. Bei dieser Methode werden die Elemente nicht heruntergeladen, sondern nur neue Dateien erstellt.

3.VerfahrenC

  $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() 

Ich bin mir nicht sicher, ob Methode C zu CSOM gehört oder zum SharPoint Einbau-Server Client-Seite, wenn es so ist, lass es mich wissen . Dies ist der Fehler, den ich erhalte:

Der Aufruf der Methode ist fehlgeschlagen, weil [Microsoft.SharePoint.Client.File] keine Methode namens "OpenBinary" enthält. Bei C: \ Benutzer \ Administrator \ Desktop \ SharePointOnPremisesBackUp \ SharePointOnPremisesBackUp.ps1: 77 Zeichen: 31
+ $ binary = $ file.OpenBinary < < < <()
+ CategoryInfo: InvalidOperation: (OpenBinary: String) [ ], Runtime
+ FullyQualifiedErrorId: MethodNotFound

und hier Powershell kann nicht finden, die OpenBinary() Methode in Microsoft.SharePoint.Client.File und es gibt fast keine Informationen über diese Methode.

Dies ist die komplette Funktion Ich versuche zu verwenden:

  1. Sapien der Powershell Studio
  2. Powershell V2 mit CSOM
  3. :
    Ich verwende

    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 
    }            
    

    die Werkzeuge

  4. SharePoint 2010 OnPremises

Bitte, wenn Sie irgendeine Lösung, Referenz, Dokumentation oder Anleitung, die nützlich sein kann, sagen Sie mir. Danke im Voraus.

Antwort

1

Nach viel Forschung fand ich eine Lösung und entscheiden, diese Methode zu verwenden:

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 
} 

Denken Sie daran, eine Ausnahmebehandlung zu implementieren. Ich hoffe, das ist hilfreich für jemanden mit dem gleichen Problem.

Verwandte Themen