-->

четверг, 22 мая 2014 г.

переносим элементы в другой список с помощью PowerShell (архивирование элементов)

Добрый день, сегодня я напишу, как можно переносить элементы с одного списка в другой. Мой способ заключается в копировании элементов, а не перемещении. К сожалению я не нашел лучшего способа, ведь .MoveTo элемента списка не поддерживает. В данном способе есть недочет, перенесенные элементы теряют информацию о том кто и когда их создал в начальном списке.
Что делает скрипт:
  • Получает все элементы, которые отвечает фильтру CAML
  • Копирует полученные элементы в другой список
  • Можно удалить исходные элементы (в случае если проводим архивирование и нужно очистить список) 



Вот сам скрипт
$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()