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

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

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



Вот сам скрипт
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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 = '<where><eq><fieldref name="Title"><value type="Text">item 1</value></fieldref></eq></where>' # фильтр созданный 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()

Комментариев нет:

Отправить комментарий