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