Take the 2-minute tour ×
SharePoint Stack Exchange is a question and answer site for SharePoint enthusiasts. It's 100% free, no registration required.

Quick note: First and foremost - this is somewhat in line with a previous post of mine found here: Move files between document libraries in the same Site Collection however I've opened a new question for this as I didn't want to update my original post and destroy the value to be gained there for future readers as this is, in essence, a spin-off question of my original one.

Goal I have a number of document libraries (100+) that have content in them that need to be archived for the end of financial year. Essentially content will move from the source document library, to the root of the destination library.

Current Code

[reflection.assembly]::loadwithpartialname("microsoft.sharepoint") > $null

$org = "http://dev/re/ad/wf/Approval%20History%20%20Centre%20EV" 
$dest = "http://dev/re/ad/wf/Approval%20History%20%20Centre%20EV1" 

$site = new-object microsoft.sharepoint.spsite $org
$web = $site.openweb()

$srcLibrary = $web.Lists["Approval History - Centre EV"] 
$destLibrary = $web.Lists["Approval History - Centre EV1"] 

$destFiles = $destLibrary.Folders["Approval History - Centre EV"]

write-host "srcLibrary is: $srcLibrary"
write-host "destLibrary is: $destLibrary"
write-host "destFiles is: $destFiles"


foreach ($item in $srcLibrary.Items) 
{ 
   if ($item.File) 
   {
        $curFile = $item.file.OpenBinary() 
        $destURL = $dest + "/" + $item.file.Name 

        write-host "destURL is: $destURL"
        write-host "srcLibrary is: $srcLibrary"

        $destFiles.Add($destURL, $curFile, $true)
    }
} 

Error and output

I'm currently seeing the following output:

srcLibrary is: Approval History - Centre EV
destLibrary is: Approval History - Centre EV1
destFiles is: 
destURL is: http://dev/re/ad/wf/Approval%20History%20%20Centre%20EV1/EV_00249629__2011-03-15T095937077.xml
srcLibrary is: Approval History - Centre EV
You cannot call a method on a null-valued expression.
At line:30 char:23
+         $destFiles.Add <<<< ($destURL, $curFile, $true)
    + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Code Issue

Currently $destLibrary in the code above is assigning to a null value - unfortunately I lack the expertise to understand why. I've also tried creating a folder named 'Archived' in the destination library and setting this line to the following:

$destFiles = $destLibrary.Folders["Archived"]

Unfortunately this results in the same output as shown above.

A bit about the farm

Server name: dev
Site Collection: /re/
Site: /wf/, a sub-site of /ad/
share|improve this question
    
What's the output of: $destLibrary.Folders | gm and $destLibrary.Folders | fl * after you've set the $destLibrary value? –  Chris N Jul 19 '12 at 18:28
add comment

migrated from stackoverflow.com Aug 20 '12 at 10:23

This question came from our site for professional and enthusiast programmers.

2 Answers

up vote 4 down vote accepted

Try this,

// Get your source and destination libraries
SPList source = web.GetList(web.ServerRelativeUrl + @"/SourceDocLib");
SPList destination = web.GetList(web.ServerRelativeUrl + @"/DestinationDocLib");

// Get the collection of items to move, use source.GetItems(SPQuery) if you want a subset
SPListItemCollection items = items = source.Items;

// Get the root folder of the destination we'll use this to add the files
SPFolder folder = web.GetFolder(destination.RootFolder.Url);

// Now to move the files and the metadata
foreach (SPListItem item in items)
{   
    //Get the file associated with the item     
    SPFile file = item.File;
    // Create a new file in the destination library with the same properties
    SPFile newFile = folder.Files.Add(folder.Url + "/" +file.Name, file.OpenBinary(),file.Properties,true);
    // Optionally copy across the created/modified metadata                        
    SPListItem newItem = newFile.Item;
    newItem["Editor"] = item["Editor"];
    newItem["Modified"] = item["Modified"];
    newItem["Author"] = item["Author"];
    newItem["Created"] = item["Created"];

    // UpdateOverwriteVersion() will preserve the metadata added above. 
    newItem.UpdateOverwriteVersion();                              
}

If you want to delete the originals as well use for (int i = items.Count -1; i > -1 ; i--) instead of the foreach to iterate backwards through the collection and items[i].Recycle(); or items[i].Delete(); to recycle or delete the original after you have moved it.

share|improve this answer
add comment

try something like :

$web = "http://dev/re/ad/wf/"

$orgLibrary = (Get-SPWeb $web).Folders["Approval History - Centre EV"]
$destLibrary = (Get-SPWeb $web).Folders["Approval History - Centre EV1"]

$destFiles = $destLibrary.Files
foreach ($file in $orgLibrary.Files)
{
    $curFile = $file.OpenBinary()
    $destURL = $destFiles.Folder.Url + "/" + $file.Name
    $destFiles.Add($destURL, $curFile, $true)
} 

SOURCE

share|improve this answer
    
I quoted this one in my original posting :) The premise of this post is to find a way to do this in MOSS, this script only supports Sharepoint 2010... thanks anyway! –  ElvisLikeBear Jul 18 '12 at 9:08
    
On 2007, try to use the extended stsadm by gary lapointe : blog.falchionconsulting.com/index.php/2008/05/… –  Le_Fredo Jul 19 '12 at 14:01
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.