Загрузите элементы библиотеки SharePoint 2010 с помощью PowerShell V2 с CSOM

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

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

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

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

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

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

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

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

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

Ошибка вызова метода, поскольку [Microsoft.SharePoint.Client.File] не содержит метод с именем "OpenBinary". В C:\Users\ Администратор \ Desktop \ SharePointOnPremisesBackUp \ SharePointOnPremisesBackUp.ps1: 77 char: 31
+ $ binary = $ 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. Сапиен PowerShell Studio
  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
}

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

Другие вопросы по тегам