Copy SharePoint files in folders to disk
A common request is extracting all the files within folders in a document library. The simple script below allows one to specify a source folder, library, web, and output location. The $TargetRootFolder can be found as a URL parameter in the URL when viewing the target folder for migrating. The script preserves the full URL structure including all folders and subfolders. Recursion makes this clean and simple.
$webUrl = "http ://SharePoint/sites/MyWeb"
$TargetLib="MyLibrary"
$destination = "L:OutputLocation"
#derived right from the URL when viewing the folder, this works:
$TargetRootFolder="%2MyWeb%2SubFolder"
$web = Get-SPWeb -Identity $webUrl
function ProcessFolder
{
param($folderUrl)
$folder = $web.GetFolder($folderUrl)
if (!$Folder.exists)
{
Write-Host -ForegroundColor DarkRed "Whoops, folder at source does not exist, please recheck"
}
else
{
$destinationfolder = $destination + "/" + $folder.Url
if (!(Test-Path -path $destinationfolder))
{
$dest = New-Item $destinationfolder -type directory
}
foreach ($file in $folder.Files)
{
$binary = $file.OpenBinary()
$stream = New-Object System.IO.FileStream($destinationfolder + "/" + $file.Name), Create
$writer = New-Object System.IO.BinaryWriter($stream)
$writer.write($binary)
$writer.Close()
Write-Host "+" -NoNewline
}
foreach ($sf in $folder.SubFolders)
{
ProcessFolder($sf.url) #Not quite Ackerman's function, this is first order recursion
}
}
}
ProcessFolder($TargetRootFolder)
Now, if you need to ensure no documents ever overwrite, such as if you rename on the fly, here’s a bit of code that will cycle through optional filenames until one is found that does not exist.
$inc=$null;
while (test-path $OutFileName)
{
$JPname="$($JPTitle)DUP$($inc)$($JPName.Substring($JPName.lastindexof(".")))"
$OutFileName=$destinationfolder + "/" + $inc+$JPName
$Inc++;
Write-Host "!" -NoNewline -ForegroundColor DarkRed
}
Want to talk?
Drop us a line. We are here to answer your questions 24*7.