A colleague of mine recently asked me “Ryan, can you give me some PowerShell code that can give me a list of all sites and sub sites as well as all lists and libraries within each of those sites – for an entire web application?”
“Of course”, I said…
I had some other scripts and functions that were similarly constructed, so I simply took one that was close and adapted it to make it work.
This function, which I’ve called “Get-SPSiteInventory” will run against either an entire Web Application (using the -WebApplication switch param) or a single Site Collection (using the -SiteCollection switch param).
I’ve tested this both by sending the output straight to a file (using the Out-File cmdlet) as well as just running in the shell – both work pretty nicely.
I’ve excluded comment-based help for better readability, and the syntax is as follows…
To run against a site collection:
Get-SPSiteInventory -Url http://spsite -SiteCollection
To run against a web application:
Get-SPSiteInventory -Url http://spwebapp -WebApplication
The entire function:
function Get-SPSiteInventory { Param( [string]$Url, [switch]$SiteCollection, [switch]$WebApplication ) Start-SPAssignment -Global if ($SiteCollection) { $site = Get-SPSite $Url $allWebs = $site.allwebs foreach ($spweb in $allWebs) { " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " $spweb.Url $spweb.Lists | select Title, BaseType $spweb.dispose() } $site.dispose() } elseif ($WebApplication) { $wa = Get-SPWebApplication $Url $allSites = $wa | Get-SPSite -Limit all foreach ($spsite in $allSites) { $allWebs = $spsite.allwebs foreach ($spweb in $allWebs) { " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " $spweb.Url $spweb.Lists | select Title, BaseType $spweb.dispose() } } } Stop-SPAssignment -Global }