Перенос папок в SharePoint’e

Скрипт переноса папок.

Перемещение папок между папками…Ну, где-то так. Извините за тафтологию…

Решение представляет собой скрипт в PowerShell’e. Для реализации решения пользуйтесь оболочкой — Windows PowerShell ISE.
Данный скрипт находит в определенной файловой структуре нужную папку, создает в ней т.н. «архивную папку», и переносит в нее все папки из указанного места, выбранные по определенным настройкам фильтра.

Статья находится в разделе SharePoint -> PowerShell scripts.








Итак, что у нас есть:

1) У нас есть сайт в сайтовой коллекции, данные в которой хранятся в списках (объект типа List) с определенной структурой подпапок. Так, например, лист представляет собой хранилище документов одределенного региона (локи). В каждом листе — количество папок соответствует количеству отделений организации в данном регионе. У каждой организации — 3 подотдела, сл-но в папке каждого отделения — еше 3 папки. И вот, в этих 3-х папках, и надо создать папку, которая будет в себе содержать папки с документами этого отдела, например, за 2010 год. (все подпапки в папке отдела (пе месяцам , и др. событиям) — будут отфильтрованы (Like) по наименованию объекта — чтобы в имени присутствовало число 10, и не присутствовало (NotLIke) 11). Ну, и, соответственно, будет создана т.н. «архивная» папка, куда и будут перемещены т.н. «архивные» документы.

2) нельзя не отметить отдельно ресурс, которй подтолкнул меня на мысль, как такое можно осуществить. Идея была подчерпнута вот отсюда: http://sharepointstruggle.blogspot.com/2010/07/sharepoint-vs-powershell-moving-list.html . В общем, чувакам — респект и уважуха 🙂

Ну, да ладно. Приступим к описанию нашего решения. По порядку.

Решение представляет собой скрипт в PowerShell’e. Для реализации решения пользовался оболочкой — Windows PowerShell ISE.

Сначала определяем переменные:

$WebURL="http://"; # Название сайта.
$ListDisplayName = "Название библиотеки, в которой хранятся итемы"; # название библиотеки, в которой хранятся объекты региона
$NewFolderName = "ГОД 2010";  # Название новой «архивной» папки, куда будут перенесены папки, имеющие отношение к 2010-му году.

Для получения доступа к WSS.NET API нобходимо загрузить сборку (Assembly), как показано ниже.

function LoadWSSAssembly
{
write-host "Loading WSS Assembly…"
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")
write-host "Done…"
}

Далее идет сама функция, которая создает «архивную» папку, и переносит туда объекты (итемы). В нашем случае — папки.

function MoveItems
{
[MIcrosoft.SharePoint.SPSite] $Site = New-Object Microsoft.sharepoint.spsite($WebURL);
[Microsoft.SharePoint.SPWeb] $Web = $Site.OpenWeb();
write-host $Web.URL;
[Microsoft.SharePoint.SPList] $List = $Web.Lists[$ListDisplayName];
[Microsoft.SharePoint.SPFolder] $FolderName = $List.RootFolder;
write-host $FolderName.SubFolders;
$i=0;
foreach ($ItemSub in $FolderName.SubFolders) {
#write-host "Folder : " $FolderName.SubFolders[$i];
if ($ItemSub.Name -ne "Forms") {
write-host "SubFolder[" $i "] — " $ItemSub.Name;
$j=0;
foreach ($ItemSubSub in $ItemSub.SubFolders) {
write-host " SubSubFolder[" $j "] — " $ItemSubSub.Name;
$k=0;
$FLAG_folder_exist = "0";
foreach($ItemSubSubSub in $ItemSubSub.SubFolders) {
write-host " SubSubSubFolder[" $k "] — " $ItemSubSubSub.Name " : Url : " $ItemSubSubSub.Url;
# ищем папку "ГОД 2010"
if ($ItemSubSubSub.Name -eq $NewFolderName) {
# Флаг того, что папка "ГОД 2010" уже есть, и ее создавать не надо
$FLAG_folder_exist = "1";
}
$k++;
}
# Если папки "ГОД 2010" нет ($FLAG_folder_exist = "0"), то создаем ее
if ($FLAG_folder_exist -eq "0") {
# Создаем папку
write-host "Создаем папку ГОД 2010 …";
$NewFolderItem = $List.Items.Add($ItemSubSub.ServerRelativeUrl,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$NewFolderName);
$NewFolderItem.SystemUpdate();
$List.Update();
write-host "Папка создана.";
#Need to get a fresh reference of the folder to ensure we can see the new one just created:
$ItemSubSub = $ItemSubSub.ParentWeb.GetFolder($ItemSubSub);
} else {
write-host "Папка ГОД 2010 уже есть";
}
# ********************
# находим идентификатор "новой папки"
foreach($ItemSubSubSub in $ItemSubSub.SubFolders) {
if ($ItemSubSubSub.Name -eq $NewFolderName) {
[Microsoft.SharePoint.SPFolder] $new_Folder = $ItemSubSubSub;
$new_FolderName = $ItemSubSubSub.Name;
$new_FolderUrl = $ItemSubSubSub.Url;
}
}
# переносим все папки, в названии котор_х нет "11" в папку "ГОД 2010"
foreach($ItemSubSubSub in $ItemSubSub.SubFolders) {
# Условие того, чтоб_ папка не наз_валась "ГОД 2010", и чтобы в названии папки не было "11"

if (($ItemSubSubSub.Name -ne $NewFolderName) -and ($ItemSubSubSub.Name -notlike "*11*")) {
write-host "элементы соответствуют условиям для переноса:" $ItemSubSubSub.Name;
# переносим папки
$from = $Web.URL+"/"+$ItemSubSubSub.Url;
$to1 = $Web.URL+"/"+$New_Folder.Url;
$to2 = $Web.URL+"/"+$New_Folder.Url+"/"+$ItemSubSubSub.Name;
write-host "from " $from;
#write-host "to1 " $to1;
write-host "to2 " $to2
#*****Перенос***************
$ItemSubSubSub.MoveTo($to2);
#***************************
write-host "Success…";
}
}
$j++;
}
$i++;
}
}
#dispose:
#$Web.Dispose();
#$Site.Dispose();
}

Ну, и дальше — запускаем все эти функции:

function go
{
loadWSSAssembly;
moveItems;
}
go;

Ну, и запускаем скрипт на выполнение.
Пока все с этим скриптом. Надеюсь, что вы все поймете.

 

Comments are closed.