Когда при использовании SharePoint 2013 возникает необходимость выполнить перенос группы элементов списка (List) в папку сделанную в этом же списке можно воспользоваться встроенным средством управления контентом, которое доступно при открытии ссылки /_layouts/sitemanager.aspx
Однако для использования данного средства может понадобится активация фичи средств публикации на уровне сайта. В некоторых случая активация этой фичи может оказаться нежелательной и тогда для возможности переноса элементов списка можно попробовать воспользоваться PowerShell для SharePoint.
При использовании PowerShell первое что нам может понадобиться – это узнать внутренний идентификатор папки в которую мы хотим выполнить перенос элементов. Сделать это можно разными способами, самый простой из которых – с помощью Internet Explorer открыть список SharePoint, где в листинге элементов присутствует целевая папка и вызвав функцию средств разработчика (Developer Tools – вызов по кнопке F12) навести курсор на эту папку.
Далее пример скрипта, в котором будет производиться выборка из списка всех элементов у которых значение поля "№ ресурса" начинается с последовательности символов "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-запрос заточить его под свои нужды.
Добавить комментарий