Hi Powershell Experts,
Need help in modifying SQL Server based powershell script. I’am not a expert in Powershell.
I have below PS script which will display the database file info like dbname, physicalfilename, size, free,used etc. It is working fine for 1 instance. However, I want this to run against multiple sql instances and in the output I want to see 1st column as InstanceName which is not there in the below code.
Also, for each instance, the output should like as follows
Server 1:
Table grid data for that instance.
Server 2:
Table grid data for that instance.
Server 3:
Table grid data for that instance.
Code:
$svr = new-object (‘Microsoft.SqlServer.Management.Smo.Server’) localhost
$dbfl = @()
foreach ($db in $svr.Databases) {
$dbname = $db.Name
foreach ($fg in $db.FileGroups) {
foreach ($fl in $fg.Files) {
$dirnm = $fl.FileName | Split-Path -Parent
$filnm = $fl.FileName | Split-Path -Leaf
$dfl = $fl | select @{Name=“DBName”; Expression={$dbname}}, Name, @{Name=“Directory”; Expression={$dirnm}}, @{Name=“FileName”; Expression={$filnm}}, @{Name=“Size(MB)”;Expression={$fl.Size/1024}}, @{Name=“UsedSpace(MB)”;Expression={$fl.UsedSpace/1024}}, @{Name=“FreeSpace(MB)”;Expression={($fl.Size - $fl.UsedSpace)/1024}} ,@{Name=“Used%”;Expression={(($fl.UsedSpace/$fl.Size)*100)}},@{Name=“Free%”;Expression={((($fl.Size-$fl.UsedSpace)/$fl.Size)*100)}}
$dbfl += $dfl
}
}
foreach ($fl in $db.LogFiles) {
$dirnm = $fl.FileName | Split-Path -Parent
$filnm = $fl.FileName | Split-Path -Leaf
$dfl = $fl | select @{Name=“DBName”; Expression={$dbname}}, Name, @{Name=“Directory”; Expression={$dirnm}}, @{Name=“FileName”; Expression={$filnm}}, @{Name=“Size(MB)”;Expression={$fl.Size/1024}}, @{Name=“UsedSpace(MB)”;Expression={$fl.UsedSpace/1024}}, @{Name=“FreeSpace(MB)”;Expression={($fl.Size - $fl.UsedSpace)/1024}}, @{Name=“Used%”;Expression={(($fl.UsedSpace/$fl.Size)*100)}},@{Name=“Free%”;Expression={((($fl.Size-$fl.UsedSpace)/$fl.Size)*100)}}
$dbfl += $dfl
}
}
Format for HTML
$a = “”
$a = $a + “BODY{background-color:white;}”
$a = $a + “TABLE{font-family: Arial;font-size: 12px;width:100%; height:75%; border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}”
$a = $a + “TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;color:white; background-color: green}”
$a = $a + “TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:white}”
$a = $a + “”
$dbfl | ConvertTo-HTML -head "Database File Space Report " -body $a | Out-File D:\Scripts\Datafile.html
$EmailFrom = “xxxxx@gmail.com”
$EmailTo = “aaa@gmail.com,bbb@gmail.com”
$Subject = “Datafile size report”
$Body = Get-Content(“D:\Scripts\Datafile.html”)
$SMTPServer = “smtp.gmail.com”
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“xxxxx@gmail.com”, “pwd123”);
$message = New-Object Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $body)
$message.IsBodyHtml = $true;
$SMTPClient.Send($message)