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"
========================================================================
========================================================================
#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"
========================================================================