Ok guys, I did work on this script for couple of hours and came up with working solution, basically this script will copy/replace items from one SharePoint List to another SharePoint List.
Tip: Save the Source list as templace without Content and create desination list with source template and disable any workflows that are associated in destination list.
FYI: I did not test in SP 2013, this scripts runs perfectly in SP 2010.

####################################################################
#Copy/Replace items from one list to another list with Attachments
#Original Author:Adi
#Enhancements - Author: Indra Appala
####################################################################

Remove-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
   try
   {    
   $srcListSiteUrl = "http://SharePoint/sites/Site1/"    
   $SourceListName = "Source List"     
   $dstListSiteUrl = "http://SharePoint/sites/Site2/"    
   $DestinationListName = "Destination List"     
   $keyColumnInternalName = "Title"     
   $sourceListWeb = Get-SPWeb -identity $srcListSiteUrl    
   $sourceListUrl = $sourceListWeb.ServerRelativeUrl + "/lists/" + $SourceListName;     
   $dstListWeb = Get-SPWeb -identity $dstListSiteUrl    
   $destinationListUrl = $dstListWeb.ServerRelativeUrl + "/lists/" + $DestinationListName;
   $SourceList = $sourceListWeb.GetList($sourceListUrl);   
   $DestinationList = $dstListWeb.GetList($destinationListUrl); 

 #Filtering Items based on the Date as we do not want to archive all items in the list
      
   $filterQuery = '				
			
				 2014-11-01T02:32:20Z
			
			
			
				 2014-11-02T02:32:20Z
			
			'     

	$CategoryQuery = new-object Microsoft.SharePoint.SPQuery
	$CategoryQuery.Query = $filterQuery
 
$sourceSPListItemCollection = $SourceList.GetItems($CategoryQuery);
Write-Host Total Items to Copy : $sourceSPListItemCollection.Count  #Always better to know the number of items before we start copying to destination list

foreach($srcListItem in $sourceSPListItemCollection) 
   {           
   #CAML query of the common column (Title)
   $keyValue = $srcListItem[$keyColumnInternalName]
	Write-Host $keyValue
	$camlQuery =''+$keyValue+'  '
	$spQuery = new-object Microsoft.SharePoint.SPQuery
	$spQuery.Query = $camlQuery
	$spQuery.RowLimit = 1
	
	#check if the item is already present in destination list
	
	$destItemCollection = $DestinationList.GetItems($spQuery)
	
		if($destItemCollection.Count -gt 0)
				{
				write-host "list item already exists, updating "
				foreach($dstListItem in $destItemCollection) 
					{  
						foreach($spField in $dstListItem.Fields)
								{
									if ($spField.ReadOnlyField -ne $True -and  $spField.InternalName -ne "Attachments")
											{
												$dstListItem[$spField.InternalName] = $srcListItem[$spField.InternalName];
											}
								}
					# Handle Attachments
					foreach($leafName in $srcListItem.Attachments) 
						{               
							$spFile = $SourceList.ParentWeb.GetFile($srcListItem.Attachments.UrlPrefix + $leafName)
							$dstListItem.Attachments.Add($leafName, $spFile.OpenBinary());
							}              
							$dstListItem.Update() 
							} 
							}        
		else 
		{            
			write-host "adding new item" 
			
			$newSPListItem = $DestinationList.AddItem(); 
			foreach($spField in $srcListItem.Fields)
            {
				if ($spField.ReadOnlyField -ne $True -and  $spField.InternalName -ne "Attachments")
				{ 
				$newSPListItem[$spField.InternalName] = $srcListItem[$spField.InternalName]; 
				}
			}
				# Handle Attachments
				foreach($leafName in $srcListItem.Attachments)
				{                
				$spFile = $SourceList.ParentWeb.GetFile($srcListItem.Attachments.UrlPrefix + $leafName)
                $newSPListItem.Attachments.Add($leafName, $spFile.OpenBinary());
				}            
				$newSPListItem.Update()
		} 
	} 
}
	catch 
		{ 
		write-host $_.exception 
		} 
	finally 
		{        
		if($sourceListWeb -ne $null){$sourceListWeb.Dispose()}
		if($dstListWeb -ne $null){$dstListWeb.Dispose()}
		}

By Indra

SharePoint Architect

Leave a Reply