Here’s a short PowerShell script that :
1. Connects to your report server
2. Creates the same folder structure you have in your Report Server
3. Download all the SSRS Report Definition (RDL) files into their respective folders
In addition to backing up your Source Project, your ReportServer database, or good old RSScripter (see http://sqlserver-indo.org/blogs/mca/archive/2009/03/08/extract-and-transfer-rdl-files-from-ssrs.aspx) this is just another way you can “backup” or archive your reports.
#note this is tested on PowerShell v2 and SSRS 2008 R2 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Xml.XmlDocument"); [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO"); $ReportServerUri = "http://yourreportserver/ReportServer/ReportService2005.asmx"; $Proxy = New-WebServiceProxy -Uri $ReportServerUri -Namespace SSRS.ReportingService2005 -UseDefaultCredential ; #check out all members of $Proxy #$Proxy | Get-Member #http://msdn.microsoft.com/en-us/library/aa225878(v=SQL.80).aspx #second parameter means recursive $items = $Proxy.ListChildren("/", $true) | ` select Type, Path, ID, Name | ` Where-Object {$_.type -eq "Report"}; #create a new folder where we will save the files #PowerShell datetime format codes http://technet.microsoft.com/en-us/library/ee692801.aspx #create a timestamped folder, format similar to 2011-Mar-28-0850PM $folderName = Get-Date -format "yyyy-MMM-dd-hhmmtt"; $fullFolderName = "C:Temp" + $folderName; [System.IO.Directory]::CreateDirectory($fullFolderName) | out-null foreach($item in $items) { #need to figure out if it has a folder name $subfolderName = split-path $item.Path; $reportName = split-path $item.Path -Leaf; $fullSubfolderName = $fullFolderName + $subfolderName; if(-not(Test-Path $fullSubfolderName)) { #note this will create the full folder hierarchy [System.IO.Directory]::CreateDirectory($fullSubfolderName) | out-null } $rdlFile = New-Object System.Xml.XmlDocument; [byte[]] $reportDefinition = $null; $reportDefinition = $Proxy.GetReportDefinition($item.Path); #note here we're forcing the actual definition to be #stored as a byte array #if you take out the @() from the MemoryStream constructor, you'll #get an error [System.IO.MemoryStream] $memStream = New-Object System.IO.MemoryStream(@(,$reportDefinition)); $rdlFile.Load($memStream); $fullReportFileName = $fullSubfolderName + "" + $item.Name + ".rdl"; #Write-Host $fullReportFileName; $rdlFile.Save( $fullReportFileName); }
Enjoy!
Thanks, that’s really useful : )
LikeLike
I’m getting this error when running this script against both a SQL-2005 and a SQL-2008 SSRS instance:
The term ‘New-WebServiceProxy’ is not recognized as the name of a cmdlet, funct
ion, script file, or operable program. Check the spelling of the name, or if a
path was included, verify that the path is correct and try again.
My $ReportServerUri is defined correctly.
What could I be missing?
Thank you,
Marios Philippopoulos
LikeLike
This worked perfectly. You saved me at least a day of file->save-as’ing – thanks a million!!!
LikeLike
Worked great! Thanks
LikeLike
how could i pass the authentication(username, pass)?
if i’m going to download from remote computer.
Thanks B4.
LikeLike
I am also getting the error below.
The term ‘New-WebServiceProxy’ is not recognized as the name of a cmdlet, funct
ion, script file, or operable program. Check the spelling of the name, or if a
path was included, verify that the path is correct and try again.
Any thoughts as to what might be wrong?
LikeLike
What version of PowerShell are you using?
LikeLike
you are a life saver
🙂
LikeLike
Worked perfectly.. Thanks so much.
LikeLike
Hello,
$Proxy = New-WebServiceProxy -Uri $ReportServerUri -Namespace SSRS.ReportingService2005 -UseDefaultCredential ;
May I know what is the instance name use on this line? I’m referring with SSRS.ReportingService2005.
LikeLike
Excellent….really useful
Can we do the for upload instead of download.
LikeLike
Excellent….really useful
Can we do the same for upload instead of download.
LikeLike
How can i do the same with rds ?
Because i need to save DataSource too.
LikeLike
nice Work :D…it worked perfectly…
LikeLike
Amazing! Works like Knife on Butter..
TY
LikeLike
Worked for me on SSRS 2012. Is it possible to download a single folder, because this script downloads everything on the report server.
LikeLike
Couple things if you are using SSRS2008 R2; It really uses 2010 so ReportService2005.asmx should be ReportService2010.asmx. Also, you want to use -Namespace SSRS.ReportingService2010 instead.
RS2010 also uses $Proxy.GetItemDefinition($item.Path); instead.
LikeLike
Can you please provide a script to upload all the folders back to report server.
LikeLike
Thanks so much! Fantastic script.
LikeLike
Sorry, I’m a newbie when it comes to PowerShell… how to I run this script?
Can you provide detail instructions for those of us who are not familiar with PowerShell?
LikeLike
For those who run into a webserviceproxy error, I had the problem as well initially. I hadn’t realized that the “/ReportService2005.asmx” path on the end of my report server URL was important and had not included it at first; particularly because I am SSRS 2008 R2.
In any case, add that /ReportService2005.asmx back on if you took it off and that might help.
LikeLike
thanks a lot, it was so helpfull this article and the solution too!
The wired thing, was that i migrated time ago from 2005 to 2008, and I changed the code for the $ReportServerUri = “http://my server/ReportServer/ReportService2005.asmx”;
ReportService2008.asmx and didn’t work but i left has you have it with 2005 and works.
LikeLike
How can I backup the report along with the subscriptions is there any way
LikeLike
Been a long time since you posted this, but it really helped me out today. 🙂
LikeLike
That’s awesome, so happy to hear 🙂 thank you for sharing 🙂
LikeLike