SharePoint 2013 — Перенос библиотеки с SharePoint 2010

image

В этой заметке мы рассмотрим два 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"

Всего комментариев: 3 Комментировать

  1. Андрей /

    ошибка в строчке:
    $spFile = $folder.Files.Add(«Lists/»+$folder.Url + «/» + $_.Title, [System.IO.Stream]fileStream, $true)

    я исправил ее вот так:
    $spFile = $folder.Files.Add($_.Title, [System.IO.Stream]$fileStream, $true)

  2. Sergey /

    Спасибо большое за статью. Насколько сложнее будет перенести библиотеку документов с сохранением версионности?

  3. Владимир /

    надо дописывать скрипт.
    за основу можно взять эту статью https://gallery.technet.microsoft.com/office/Test-bb3ed1ca

Добавить комментарий