Добрый день, сегодня я напишу, как можно переносить элементы
с одного списка в другой. Мой способ заключается в копировании элементов, а не
перемещении. К сожалению я не нашел лучшего способа, ведь .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 = 'item 1 ' # фильтр созданный 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()
Комментариев нет:
Отправить комментарий