SharePoint 2013 - Перенос элементов списка в папку этого же списка

imageКогда при использовании SharePoint 2013 возникает необходимость выполнить перенос группы элементов списка (List) в папку сделанную в этом же списке можно воспользоваться встроенным средством управления контентом, которое доступно при открытии ссылки /_layouts/sitemanager.aspx

image

Однако для использования данного средства может понадобится активация фичи средств публикации на уровне сайта. В некоторых случая активация этой фичи может оказаться нежелательной и тогда для возможности переноса элементов списка можно попробовать воспользоваться PowerShell для SharePoint.

При использовании PowerShell первое что нам может понадобиться – это узнать внутренний идентификатор папки в которую мы хотим выполнить перенос элементов. Сделать это можно разными способами, самый простой из которых – с помощью Internet Explorer открыть список SharePoint, где в листинге элементов присутствует целевая папка и вызвав функцию средств разработчика (Developer Tools – вызов по кнопке F12) навести курсор на эту папку.

imageДалее пример скрипта, в котором будет производиться выборка из списка всех элементов у которых значение поля "№ ресурса" начинается с последовательности символов "01.02".

# Перемещение элементов списка в папку того же списка

#

$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}

if ($snapin -eq $null)

{

  Add-PSSnapin "Microsoft.SharePoint.Powershell"

}

# $url - URL сайта; $listName - Название списка

# $folderId - Внутренний идентификатор целевой папки списка

# Чтобы узнать id папки используем  Developer Tools (F12 в Internet Explorer)

# $fieldName - Имя поля в списке по которому отбираем элементы для переноса

# $fieldValue - Значение в искомом поле

#

$url = "http://site.holding.com"

$listName = "Перечень информационных ресурсов"

$folderId = 1877

$fieldName = "№ ресурса"

$fieldValue = "01.02"

 

$web = Get-SPWeb $url

$list = $web.Lists[$listName]

 

$folder = $list.GetItemById($folderId)

# если элементы списка надо перенести в корень списка

#$destUrl = $web.Url + "/" + $list.RootFolder

# если элементы списка надо перенести в конкретную папку

$destUrl = $web.Url + "/" + $folder.Url         

 

$internalName= ($list.fields | select Title, InternalName| where {$_.Title -eq $fieldName}).InternalName

$camlQuery = "<Where><BeginsWith><FieldRef Name='"+$internalName+"'/><Value Type='Text'>"+$fieldValue+"</Value></BeginsWith></Where>"   

 

$count = 0   

$query = New-Object Microsoft.SharePoint.SPQuery;

$query.Query = $camlQuery

$query.ViewAttributes = "Scope='RecursiveAll'"

 

foreach ($item in $list.GetItems($query))

{       

    $destinationUrl = $destUrl + "/" + $item.ID + "_.000" 

    $web.GetFile($item.Url).MoveTo($destinationUrl)

    $count++

}

write-host "Перенесено элементов: " $count  -ForegroundColor "green"

Понятно что скрипт не универсален и создан под конкретную задачу, но при необходимости вы можете отредактировав CAML-запрос заточить его под свои нужды.

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