Wednesday, February 5, 2014

Download all InfoPath within SharePoint Web Application using PowerShell

Below PowerShell script can be used to download/Backup all infoPath forms residing within a Web Application with a folder structure similar to the URL.

========================================================================

#Change below url to your web app URL
$SPWebApp = Get-SPWebApplication ('https://YourWebApplication.com/')
$destination = "d:\\temp\\InfoPathBackup\\"

"Site Name`tList Name`tUrl`tDocs`tLast Mod`tWF`tLive WF`tLive WF Names`tTemplate" > d:\temp\AllIPDocLibs.csv

#loop through each site in the site collection
 $cnt = $SPWebApp.Sites.count.toString()
  "Total Site collection -: $cnt "
foreach ($SPSite in $SPWebApp.Sites) #loop through all site collection
{
   $cnt = $SPSite.allwebs.count.toString()
  "Total number of Sites in collection -: $cnt "
   $SiteTitle = $SPSite.url.toString()
   "PROCESSING Site collection $SiteTitle"
 
$url = $SiteTitle
$req = [system.Net.WebRequest]::Create($url)
$req.UseDefaultCredentials = $true
try {
       $res = $req.GetResponse()
     } catch [System.Net.WebException] {
       $res = $_.Exception.Response
     }

if ( $res.StatusCode -eq "OK" )
{
  $ErrorActionPreference="SilentlyContinue"
   foreach($webs in $SPSite.allwebs)
   {
       
#use this for output
$webTitle = $webs.title.toString()
"PROCESSING site $webTitle"

#loop though each list in the current website
for($i=0;$i -ne $webs.lists.count;$i++)
{
$list = $webs.lists[$i]
#this is used for output and to make the code a little more readable
$listTitle = $list.toString()
$listUrl = $list.DefaultViewUrl
$listCount = $list.ItemCount

if( $list.BaseType -eq "DocumentLibrary"  -and
$list.BaseTemplate -eq "XMLForm")
{
$listModDate = $list.LastItemModifiedDate.ToShortDateString()
$listTemplate = $list.ServerRelativeDocumentTemplateUrl
$listWorkflowCount = $list.WorkflowAssociations.Count
$listLiveWorkflowCount = 0
$listLiveWorkflows = ""
foreach ($wf in $list.WorkflowAssociations)
{
if ($wf.Enabled)
{
$listLiveWorkflowCount++
if ($listLiveWorkflows.Length -gt 0)
{
$listLiveWorkflows = "$listLiveWorkflows, $($wf.Name)"
}
else
{
$listLiveWorkflows = $wf.Name
}
}
}
"$webTitle`t$listTitle`t$listUrl`t$listCount`t$listModDate`t$listWorkflowCount`t$listLiveWorkflowCount`t$listLiveWorkflows`t$listTemplate" >> d:\temp\AllIPDocLibs.csv
#Downloading file to local drive
#Ensure destination directory
        $destinationfolder = $destination + "/" + $listUrl.Substring(0,$listUrl.LastIndexOf("/"))
$file.Name = $listTemplate.Substring($listTemplate.LastIndexOf("/") + 1)
        if (!(Test-Path -path $destinationfolder))
        {
            $dest = New-Item $destinationfolder -type directory
      }
#Download file
$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()
}
}
$webs.Dispose()
    }
}
else
   {  Add-Content d:\temp\DeadSites.txt "`n $SiteTitle" } #dead or inaccessible sites encountered during loop.
    $SPSite.Dispose()
}
    [GC]::Collect()
#Dispose of the site object
$SPWebApp.Dispose()
"Done"
========================================================================

No comments:

Post a Comment