Show-DatabasesOnServer.ps1

<#PSScriptInfo
 
.VERSION 1.0
 
.GUID 48bf0316-66c3-4253-9154-6fc5b28e482a
 
.AUTHOR Rob Sewell
 
.DESCRIPTION Returns Database Name and Size in MB for databases on a SQL server
       
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS SQL, Database, Databases, Size
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
#>
<#
    .Synopsis
    Returns the databases on a SQL Server and their size
    .DESCRIPTION
    Returns Database Name and Size in MB for databases on a SQL server
    .EXAMPLE
    Show-DatabasesOnServer
 
    This will return the user database names and sizes on the local machine default instance
    .EXAMPLE
    Show-DatabasesOnServer -Servers SERVER1
 
    This will return the database names and sizes on SERVER1
    .EXAMPLE
    Show-DatabasesOnServer -Servers SERVER1 -IncludeSystemDatabases
 
    This will return all of the database names and sizes on SERVER1 including system databases
    .EXAMPLE
    Show-DatabasesOnServer -Servers 'SERVER1','SERVER2\INSTANCE'
 
    This will return the user database names and sizes on SERVER1 and SERVER2\INSTANCE
    .EXAMPLE
    $Servers = 'SERVER1','SERVER2','SERVER3'
    Show-DatabasesOnServer -Servers $servers|out-file c:\temp\dbsize.txt
 
    This will get the user database names and sizes on SERVER1, SERVER2 and SERVER3 and export to a text file c:\temp\dbsize.txt
    .NOTES
    AUTHOR : Rob Sewell http://sqldbawithabeard.com
    Initial Release 22/07/2013
    Updated with switch for system databases added assembly loading and error handling 20/12/2015
    Some tidying up and ping check 01/06/2016
     
#>


Function Show-DatabasesOnServer 

{
[CmdletBinding()]
param (
    # Server Name or array of Server Names - Defaults to $ENV:COMPUTERNAME
    [Parameter(Mandatory = $false, 
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true, 
    Position = 0)]
    $Servers = $Env:COMPUTERNAME,
    # Switch to include System Databases
    [Parameter(Mandatory = $false)]
    [switch]$IncludeSystemDatabases
    )
    [void][reflection.assembly]::LoadWithPartialName( "Microsoft.SqlServer.Smo" );
    foreach($Server in $Servers)
    {
    if($Server.Contains('\'))
    {
    $ServerName = $Server.Split('\')[0]
    $Instance = $Server.Split('\')[1]
    }
    else
    {
    $Servername = $Server
    } 

    ## Check for connectivity
      if((Test-Connection $ServerName -count 1 -Quiet) -eq $false){
       Write-Error "Could not connect to $ServerName - Server did not respond to ping"
       $_.Exception
       continue
        }
    
    $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $Server

    if($IncludeSystemDatabases)
    {
        try
           {
            $Return = $srv.databases| Select Name, Size
           }
        catch
            {
            Write-Error "Failed to get database information from $Server"
            $_.Exception
            continue
            }
    }
    else
    {
           try
           {
            $Return = $srv.databases.Where{$_.IsSystemObject -eq $false}| Select Name, Size
           }
        catch
            {
            Write-Error "Failed to get database information from $Server"
            $_.Exception
            continue
            }
    }
    Write-Output "`n The Databases on $Server and their Size in MB `n"
    $Return
    }
}