HowTo: Copy discussions to a new discussion board

Scenario:
You want to copy all discussions from a discussion board to another

PowerShell script:

#Copy discussions to a new discussion board

$web = Get-SPWeb "http://sharepoint.com"
$sourceList = $web.GetList("http://sharepoint.com/Lists/OldDiscussions/AllItems.aspx")
$destinationList = $web.GetList("http://sharepoint.com/Lists/NewDiscussions/AllItems.aspx")

$sourceListItems = $sourceList.Folders

foreach($item in $sourceListItems)
{
 $title = $item['Title']
 write-host "Copying $title"
 #Get desired discussion by ID
 $sourceDiscussion = $sourceList.Folders | Where-Object {$_.ID -eq $item['ID']}

 #Add new discussion to destination list
 $destinationDiscussion = [Microsoft.SharePoint.Utilities.SPUtility]::CreateNewDiscussion($destinationList.Items, $sourceDiscussion.Title)

 #Copy field values
 $destinationDiscussion["Body"] = $sourceDiscussion["Body"]
 $destinationDiscussion["Author"] = $sourceDiscussion["Author"]
 $destinationDiscussion["Editor"] = $sourceDiscussion["Editor"]
 $destinationDiscussion["Modified"] = $sourceDiscussion["Modified"]
 $destinationDiscussion["Created"] = $sourceDiscussion["Created"]
 
 #Copy attachments
 $attachmentCollection = $sourceDiscussion.Attachments
 $folder = $web.GetFolder($attachmentCollection.UrlPrefix);
 foreach ($file in $folder.Files) {
  $fileName = $file.Name
  $bytes = $file.OpenBinary() 
  $filePath = "$webURL/$folder/$fileName"
  $destinationDiscussion.Attachments.Add([System.IO.Path]::GetFileName($filePath), $bytes);
 }  
 
 #Add discussion
 $destinationDiscussion.SystemUpdate($false)

 #Get all discussion messages
 $caml='<Where><Eq><FieldRef Name="ParentFolderId" /><Value Type="Integer">{0}</Value></Eq></Where>' -f $sourceDiscussion.ID
 $query = new-object Microsoft.SharePoint.SPQuery
 $query.Query = $caml
 $query.ViewAttributes = "Scope='Recursive'";
 $sourceMessages = $sourceList.GetItems($query)

 foreach ($sourceMessage in $sourceMessages) {
  #Add new message to discussion
  $destinationMessage = [Microsoft.SharePoint.Utilities.SPUtility]::CreateNewDiscussionReply($destinationDiscussion)
  
  #Copy field values
  $destinationMessage["Body"] = $sourceMessage["Body"]
  $destinationMessage["TrimmedBody"] = $sourceMessage["TrimmedBody"]
  $destinationMessage["Author"] = $sourceMessage["Author"]
  $destinationMessage["Editor"] = $sourceMessage["Editor"]
  $destinationMessage["Modified"] = $sourceMessage["Modified"]
  $destinationMessage["Created"] = $sourceMessage["Created"]

  #Copy attachments
  $attachmentCollection = $sourceMessage.Attachments
  $folder = $web.GetFolder($attachmentCollection.UrlPrefix);
  foreach ($file in $folder.Files) {
   $fileName = $file.Name
   $bytes = $file.OpenBinary() 
   $filePath = "$webURL/$folder/$fileName"
   $destinationMessage.Attachments.Add([System.IO.Path]::GetFileName($filePath), $bytes);
  }
  
  #Add message
  $destinationMessage.SystemUpdate($false)

 }

}
write-host 'Done'

Note:
If you have created additional column you will have to add them to the script. Also make sure the columns in the script are present in both discussion boards.