Добрый день, сегодня я напишу, как можно переносить элементы
с одного списка в другой. Мой способ заключается в копировании элементов, а не
перемещении. К сожалению я не нашел лучшего способа, ведь .MoveTo элемента
списка не поддерживает. В данном способе есть недочет, перенесенные элементы
теряют информацию о том кто и когда их создал в начальном списке.
Что делает скрипт:
- Получает все элементы, которые отвечает фильтру CAML
- Копирует полученные элементы в другой список
- Можно удалить исходные элементы (в случае если проводим архивирование и нужно очистить список)
Вот сам скрипт
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) { Add-PSSnapin Microsoft.SharePoint.PowerShell; } $delOldItem = $true # удалять или нет скопированные элементы из начального списка $web = Get-SPWeb http://sites/sites/test/ $oldList = $web.Lists['1'] # название начального списка $newList = $web.Lists['2'] # название нового списка $spQuery = New-Object Microsoft.SharePoint.SPQuery $spQuery.RowLimit = 100 $spQuery.Query = '' # фильтр созданный CamlBuilder $listItems = $oldList.GetItems($spQuery) if ($listItems.Count -ne 0) { for ($i=0;$i -le $listItems.Count-1;$i++) { Write-host $i $item = $listItems[$i] Write-host $item.Title / $item.ID #создаем новый элемент $newItem = $newList.Items.Add() #Копируем поля в новый элемент foreach( $field in $item.Fields) { if (($newItem.Fields.ContainsField($field.InternalName) -eq $true) -and ($field.ReadOnlyField -eq $false) -and ($field.InternalName -ne "Attachments")) { $newItem[$field.InternalName] = $item[$field.InternalName]; } } foreach ($fileName in $item.Attachments) { $file = $item.ParentList.ParentWeb.GetFile($item.Attachments.UrlPrefix + $fileName); $imageData = $file.OpenBinary(); $newItem.Attachments.Add($fileName, $imageData); } $newItem.Update() if ($delItem -eq $true) { $item.Delete() } } } $web.Dispose() item 1
Комментариев нет:
Отправить комментарий