Param ($Servername= 'localhost')
Function Get-DBSizes ($Servername)
{
$Servername
#Check to see if it's a name instance, if it is the location will be different
if ($Servername -ilike "**") { $BaseLocation = "SQLSERVER:SQL$Servernamedatabases" }
else { $BaseLocation = "SQLSERVER:SQL$Servernamedefaultdatabases" }
$dblist = dir $BaseLocation -Force | select Name
foreach ($db in $dblist)
{
$location = $db.Name
$locationFixed = $location -replace "[.]", "%2e"
#Grab the database information
$DBInfo = dir $BaseLocation -Force | Where-Object {$_.Name -eq $location; $_.Refresh()} |
select Name,
size,
SpaceAvailable,
CompatibilityLevel
#Pull the log information
#Use measure-object to sum up sizes in the event that we might have more than one log file
$logsize = dir $BaseLocation$locationFixedlogfiles | Where-Object {$_.Name; $_.Refresh()} | Measure-Object -Property Size -Sum
$logused = dir $BaseLocation$locationFixedlogfiles | Where-Object {$_.Name; $_.Refresh()} | Measure-Object -Property UsedSpace -Sum
$sp = $DBInfo.SpaceAvailable
$TotalDBSizeMB = $DBInfo.size
$LogSizeMB = ($logsize.sum / 1024)
$LogUsedMB = ($logused.Sum / 1024)
$LogFreeMB = ($LogSizeMB - $LogUsedMB)
$DataFilesSizeMB = ($TotalDBSizeMB - $LogSizeMB)
$SpaceAvail = ($dbinfo.SpaceAvailable / 1024)
#Because SQL2000 spaceavailable includes log space we have to do different calculations depending on version
#Run DBCC UPDATEUSAGE on your 2000 databases nightly to help ensure this data is accurate
$Compat = $DBInfo.CompatibilityLevel
if ($Compat -eq 'Version80') { $DataFileFreeMB = ($SpaceAvail - $LogFreeMB) }
else { $DataFileFreeMB = $SpaceAvail }
$DataFileUsedMB = ($DataFilesSizeMB - $DataFileFreeMB)
$DataFilePercentUsed = ($DataFileUsedMB / $DataFilesSizeMB) * 100
$DataFilePercentFree = 100 - $DataFilePercentUsed
$LogPercentUsed = ($LogUsedMB / $LogSizeMB) * 100
$LogPercentFree = 100 - $LogPercentUsed
$date = (Get-Date ).ToString("yyyy-MM-dd HH:mm:ss")
#Write the results into the data table
$row = $dataTable.NewRow()
$row.ServerName = $Servername
$row.DatabaseName = $location
$row.TotalDBSizeMB = $TotalDBSizeMB
$row.DataFilesSizeMB = $DataFilesSizeMB
$row.DataFilesUsedMB = $DataFileUsedMB
$row.DataFilesFreeMB = $DataFileFreeMB
$row.DataPercentUsed = $DataFilePercentUsed
$row.DataPercentFree = $DataFilePercentFree
$row.LogFilesSizeMB = $LogSizeMB
$row.LogFilesUsedMB = $LogUsedMB
$row.LogFilesFreeMB = $LogFreeMB
$row.LogPercentUsed = $LogPercentUsed
$row.LogPercentFree = $LogPercentFree
$row.Date = $date
$dataTable.Rows.Add($row)
#And we are done
}
}
#Create data table to hold the results
$dataTable = New-Object system.Data.DataTable "Results"
#Specify the column names for the data table
$col1 = New-Object system.Data.DataColumn ServerName,([string])
$col2 = New-Object system.Data.DataColumn DatabaseName,([string])
$col3 = New-Object system.Data.DataColumn TotalDBSizeMB,([int])
$col4 = New-Object system.Data.DataColumn DataFilesSizeMB,([int])
$col5 = New-Object system.Data.DataColumn DataFilesUsedMB,([int])
$col6 = New-Object system.Data.DataColumn DataFilesFreeMB,([int])
$col7 = New-Object system.Data.DataColumn DataPercentUsed,([decimal])
$col8 = New-Object system.Data.DataColumn DataPercentFree,([decimal])
$col9 = New-Object system.Data.DataColumn LogFilesSizeMB,([int])
$col10 = New-Object system.Data.DataColumn LogFilesUsedMB,([int])
$col11 = New-Object system.Data.DataColumn LogFilesFreeMB,([int])
$col12 = New-Object system.Data.DataColumn LogPercentUsed,([decimal])
$col13 = New-Object system.Data.DataColumn LogPercentFree,([decimal])
$col14 = New-Object system.Data.DataColumn Date,([datetime])
#Add the columns to the data table
$dataTable.Columns.Add($col1)
$dataTable.Columns.Add($col2)
$dataTable.Columns.Add($col3)
$dataTable.Columns.Add($col4)
$dataTable.Columns.Add($col5)
$dataTable.Columns.Add($col6)
$dataTable.Columns.Add($col7)
$dataTable.Columns.Add($col8)
$dataTable.Columns.Add($col9)
$dataTable.Columns.Add($col10)
$dataTable.Columns.Add($col11)
$dataTable.Columns.Add($col12)
$dataTable.Columns.Add($col13)
$dataTable.Columns.Add($col14)
#Provide the name of the SQL server that we want to check
$WarningPreference = "silentlycontinue"
#Call the function to populate the results
#get-content c:Tempserverlist.txt | % {Get-DBSizes $_ }
Get-DBSizes $Servername
#Output the results
$dataTable | Out-GridView