В этой заметке мы рассмотрим два PowerShell скрипта с помощью которых можно выполнить перенос содержимого библиотеки документов или библиотеки рисунков между сайтами SharePoint 2010 и SharePoint 2013. Перенос выполняется в два этапа – сначала из сайта-источника выгружается информация об объектах, хранящихся в библиотеке в csv-файл и сами файлы с структурой папок, затем полученный контент загружается на целевой сайт. В csv-файл скрипт выгрузки записывает сведения об элементах библиотеки, даты создания и изменения, автора, атрибуты структуры папок. В подкаталог выгружаются файлы библиотеки, воссоздавая при этом структуру папок библиотеки. Поэтому перед выгрузкой важно убедиться в том, что имена файлов и папок библиотеки не слишком длинные и не содержат символов несовместимых с правилами именования файловой системы. Скрипты не переносят разрешения.
Если у вас возникнут какие-то вопросы по работе скриптов в вашем конкретном окружении, не даю гарантии, что смогу на них ответить и возможно по некоторым из них лучше будет обратиться к автору – В.Землякову в его блоге.
Скрипт выгрузки библиотеки рисунков на примере библиотеки Фотографии с сайта, построенного на базе шаблона “Блог” в SharePoint 2010
# $url - сайт SharePoint
# $libraryName - имя библиотеки
# $exportCsvFileName - путь к файлу для загрузки данных
# $Path - путь для выгрузки документов и csv-файла
# $columns = Дополнительные поля библиотеки ()
#
$url = http://SP2010.holding.com/KB
$libraryName = "Фотографии"
$exportCsvFileName = "Photo_Data.csv"
$Path = "C:TempPhoto_Data"
$columns = ""
#
$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Загрузка оснастки SharePoint Powershell"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
#
function GetDocumentInFolder($fold)
{
if ($fold.ParentFolder.Url -eq "Lists") { # если папка - корневая папка
$folderPath = $Path+""+$fold.ParentFolder.Url.replace("/", "").replace("Lists", "")
}
else {
$folderPath = $Path+""+$fold.ParentFolder.Url.replace("/", "")
}
New-Item -ItemType directory -Path $folderPath -name $fold.Name | out-null
write-host "Создана папка:" $fold.name
foreach($file in $fold.Files) {
$row = $dataTable.NewRow()
$row["Title"] = $file.Name
$row["Url"] = $file.Url.replace("Lists/", "")
$row["ParentFolder"] = $file.ParentFolder.Url.replace("Lists/", "")
$row["Modified"] = $file.item["Modified"]
$row["Created"] = $file.item["Created"]
$row["Author"] = (Get-SPUser –web $web -Limit All | where{$_.ID -eq [int] $file.item["Author"].split(";#")[0]}).loginname
$row["Editor"] = (Get-SPUser –web $web -Limit All | where{$_.ID -eq [int] $file.item["Editor"].split(";#")[0]}).loginname
$row["IsFolder"] = 0
# Добавляем специфические поля для этого списка
if ($columns -ne "") {
foreach ($columnName in $columns) {
$row[$columnName] = $file.item[$columnName]
}
}
#
$dataTable.Rows.Add($row)
$rootWeb = $web.Site.RootWeb
$bytes = $rootWeb.GetFile($rootWeb.Url + $file.ServerRelativeUrl).OpenBinary()
if ($fold.ParentFolder.Url -eq "Lists") { # если папка - корневая папка
[System.IO.FileStream] $fs = new-object System.IO.FileStream(($Path+$file.ParentFolder.Url.replace("Lists", "").replace("/", "")+""+$file.Name), "OpenOrCreate")
}
else {
[System.IO.FileStream] $fs = new-object System.IO.FileStream(($Path+$file.ParentFolder.ServerRelativeUrl.replace("/", "")+""+$file.Name), "OpenOrCreate")
}
$fs.Write($bytes, 0 , $bytes.Length)
$fs.Close()
write-host "Выгружен файл:" $file.name
}
}
#
function GetChildFolders($parentFolder)
{
foreach ($folder in $parentFolder.Subfolders) {
# условие для обычной библиотеки документов
if (($folder.Name -eq "Forms") -and ($folder.ContentTypeOrder.Name -ne "Picture")) {
continue;
}
# условие для библиотеки рисунков
if (($folder.Name -eq "Forms") -or ($folder.Name -eq "_t") -or ($folder.Name -eq "_w")) {
continue;
}
$row = $dataTable.NewRow()
$row["Title"] = $folder.Name
$row["Url"] = $folder.Url
$row["ParentFolder"] = $folder.ParentFolder.Url
$row["Modified"] = $folder.item["Modified"]
$row["Created"] = $folder.item["Created"]
$row["Author"] = (Get-SPUser –web $web -Limit All | where{$_.ID -eq [int] $folder.item["Author"].split(";#")[0]}).loginname
$row["Editor"] = (Get-SPUser –web $web -Limit All | where{$_.ID -eq [int] $folder.item["Editor"].split(";#")[0]}).loginname
$row["IsFolder"] = 1 # 1 - это папка, 0 - это файл
$dataTable.Rows.Add($row)
GetDocumentInFolder($folder)
GetChildFolders($folder)
}
}
$web = Get-SPWeb $url
$list = $web.Lists[$libraryName]
$dataTable = New-Object System.Data.DataTable
$dataTable.Columns.Add("ID") | out-null
$dataTable.Columns.Add("Title") | out-null
$dataTable.Columns.Add("Modified") | out-null
$dataTable.Columns.Add("Created") | out-null
$dataTable.Columns.Add("Author") | out-null
$dataTable.Columns.Add("Editor") | out-null
$dataTable.Columns.Add("Url") | out-null
$dataTable.Columns.Add("ParentFolder") | out-null
$dataTable.Columns.Add("IsFolder") | out-null
if ($columns -ne "") {
foreach ($columnName in $columns) {
$dataTable.Columns.Add($columnName) | out-null
}
}
if (Test-Path -path ($Path+""+$list.RootFolder.Name)) {
Remove-Item ($Path+""+$list.RootFolder.Name) -recurse
}
GetDocumentInFolder($list.RootFolder)
GetChildFolders($list.RootFolder) -force
$dataTable | Export-Csv ($Path+""+$exportCsvFileName) -Encoding "Unicode" -Delimiter "`t" -Force
$dataTable = $null
write-host 'Файл' $exportCsvFileName "выгружен"
$web.Dispose()
write-host 'Выгрузка завершена!!!' -foregroundcolor "green"
Скрипт загрузки в библиотеку рисунков на примере библиотеки Фотографии с сайта, построенного на базе шаблона “Блог” в SharePoint 2013
# $url - сайт SharePoint
# $libraryName - имя библиотеки
# $csvFileName - имя файла для загрузки данных
# $Path - путь к csv-файлу для загрузки данных в библиотеку
# $columns - поля, созданные руками для библиотеки
#
$url = "http://SP2013.holding.com/KB"
$libraryName = "Фотографии"
$csvFileName = "Photo_Data.csv"
$Path = "C:TempPhoto_Data"
$columns = ""
#
$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Загрузка оснастки SharePoint Powershell"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
#
function AddFolder() {
param (
$list,
$ServerRelativeUrl,
$folderName
)
$folder = $list.AddItem("/"+$ServerRelativeUrl, [Microsoft.SharePoint.SPFileSystemObjectType]::Folder, $folderName)
$folder["Modified"] = [datetime]::Parse($_.Modified, $ruCulture)
$folder["Created"] = [datetime]::Parse($_.Created, $ruCulture)
$Author = $web.Site.RootWeb.EnsureUser($_.Author)
$folder["Author"] = New-Object Microsoft.SharePoint.SPFieldUserValue($web, $Author.id, $Author.LoginName)
$Editor = $web.Site.RootWeb.EnsureUser($_.Editor)
$folder["Editor"] = New-Object Microsoft.SharePoint.SPFieldUserValue($web, $Editor.id, $Editor.LoginName)
$folder.Update();
write-host "Создана папка:" $folderName
}
#
$spAssignment = Start-SPAssignment
$web = Get-SPWeb $url -AssignmentCollection $spAssignment
$users = Import-Csv -Delimiter "`t" -Path ($Path+""+$csvFileName)
$list = $web.Lists[$libraryName]
$ruCulture = [Globalization.cultureinfo]::GetCultureInfo("ru-RU")
#
$users | where {
if ($_.IsFolder -eq "1") {
AddFolder -List $list -ServerRelativeUrl $_.ParentFolder -folderName $_.Title
}
else {
$fileStream = ([System.IO.FileInfo] (Get-Item ($path+""+$_.Url.replace("/", "")))).OpenRead()
$folder = $web.GetFolder($_.ParentFolder)
$spFile = $folder.Files.Add("Lists/"+$folder.Url + "/" + $_.Title, [System.IO.Stream]$fileStream, $true)
$fileStream.Close();
$item = $spFile.item
$Author = $web.Site.RootWeb.EnsureUser($_.Author)
$item["Author"]= $Author
$Editor = $web.Site.RootWeb.EnsureUser($_.Editor)
$item["Editor"] = $Editor
$item["Modified"] = [datetime]::Parse($_.Modified, $ruCulture)
$item["Created"] = [datetime]::Parse($_.Created, $ruCulture)
if ($columns -ne "") {
foreach ($columnName in $columns) {
$InternalName = ($list.Fields.GetField($columnName)).InternalName
$item[$InternalName] = $_.$columnName
}
}
$item.Update()
write-host "Загружен файл:" $_.Title
}
}
$users = $null
Stop-SPAssignment $spAssignment
write-host 'Загрузка завершена!!!' -foregroundcolor "green"
ошибка в строчке:
$spFile = $folder.Files.Add("Lists/"+$folder.Url + "/" + $_.Title, [System.IO.Stream]fileStream, $true)
я исправил ее вот так:
$spFile = $folder.Files.Add($_.Title, [System.IO.Stream]$fileStream, $true)
Спасибо большое за статью. Насколько сложнее будет перенести библиотеку документов с сохранением версионности?
надо дописывать скрипт.
за основу можно взять эту статью https://gallery.technet.microsoft.com/office/Test-bb3ed1ca