Загрузите элементы библиотеки 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
}
инструменты, которые я использую:
- Сапиен PowerShell Studio
- PowerShell V2 с CSOM
- 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
}
Не забудьте реализовать некоторую обработку исключений. Я надеюсь, что это полезно для кого-то с той же проблемой.