Powershell-Generate Automated CSVFreespace and Memory Report

This script relies the Hyper-V clusters are been managed by VMM but if you do not use VMM you can also modify based on your environment. It should just give you an idea how to collect data and use sentmail function to get a daily report of your resource status.

Note: script version 1.3 is targeted to be run as a task so no console outputs are considered, just a logfile is written into same folder where is script is located

as no user interaction is possible because we want to use this as a task following variables has to be updated in the script

$VMMServer = "YOURVMMSERVER"
$smtpServer = "YOURSMTP"
$smtpFrom = "johndoe@mydomain.com"
$SMTPPort = "25"
$Username = "johndoe@mydomain.com"
$Password = 'YOURPASSWORD'
$smtpTo = reports@mydomain.com

 
#
#Creator: Ramazan Can
#V1.2   - dumping into log and generating mail with function "SentReportviaMail"
#       - mail sender, recipient, account for authentification can be modified in function "SentReportviaMail"
#               $smtpFrom - $Username - $smtpTo 
#V1.3   - task scheduler version

#Write-Host " "
import-module virtualmachinemanager
import-module failoverclusters
$VMMServer = "YOURVMMSERVER"
$VMMClusters=(Get-SCVMHostCluster -vmmserver $VMMServer).Name
$timestamp=(get-date -Format d).Replace("/","_")
$date=Get-date
Get-item ".\CSVandMemory_Report_$timestamp.txt" -ea 0 | Remove-Item -ea 0
$logfile=".\CSVandMemory_Report_$timestamp.txt"

"This Report was run at $date " | out-file -filepath $logfile -append
" " | out-file -filepath $logfile -append

function GetCSVFreeSpace {
#incorporated and modified from https://blogs.msdn.com/b/clustering/archive/2010/06/19/10027366.aspx
$objs = @()

$csvs = Get-ClusterSharedVolume -Cluster $Cluster
foreach ( $csv in $csvs )
{
   $csvinfos = $csv | select -Property Name -ExpandProperty SharedVolumeInfo
   foreach ( $csvinfo in $csvinfos )
   {
      $obj = New-Object PSObject -Property @{
         Name        = $csv.Name
         Path        = $csvinfo.FriendlyVolumeName
         Size        = $csvinfo.Partition.Size
         FreeSpace   = $csvinfo.Partition.FreeSpace
         UsedSpace   = $csvinfo.Partition.UsedSpace
         PercentFree = $csvinfo.Partition.PercentFree
      }
      $objs += $obj
   }
}

$objs | ft -auto Name,Path,@{ Label = "Size(GB)" ; Expression = { "{0:N2}" -f ($_.Size/1024/1024/1024) } },@{ Label = "FreeSpace(GB)" ; Expression = { "{0:N2}" -f ($_.FreeSpace/1024/1024/1024) } },@{ Label = "UsedSpace(GB)" ; Expression = { "{0:N2}" -f ($_.UsedSpace/1024/1024/1024) } },@{ Label = "PercentFree" ; Expression = { "{0:N2}" -f ($_.PercentFree) }}
}

function SentReportviaMail {
$logfile=(Get-item ".\CSVandMemory_Report*" -ea 0).Name
$Logs=Get-Content $logfile
$smtpServer = "YOURSMTP"
$smtpFrom = "johndoe@mydomain.com"
$SMTPPort = "25"
$Username = "johndoe@mydomain.com"
$Password = 'YOURPASSWORD'
$smtpTo = "reports@mydomain.com"
$messageSubject = "$VMMServer - Automated CSV FreeSpace and Total Memory Report"

[string]$messagebody = ""

foreach ($log in $logs )
{
    $messagebody = $messagebody + $log + "`r`n"
}
#Write-Host " "
#Write-Host "Starting to sent mail to $smtpTo via $smtpServer ...." -ForegroundColor green
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.Send($smtpFrom,$smtpTo,$messagesubject,$messagebody)
#Write-Host "mail sent completed " -ForegroundColor green
#Write-Host " "
}


foreach ($Cluster in $VMMClusters)
{
    #Write-Host "Starting to collect memory and CSV free space data in $Cluster ....." -foregroundcolor green
    [int]$TotalFreeMemory = 0;
    [int]$TotalMemory = 0;
    $ClusterNodes = Get-Cluster $Cluster | Get-ClusterNode
    foreach ($ClusterNode in $ClusterNodes)
    {
        [int]$FreeMemory = [math]::round(((Get-WmiObject -ComputerName $ClusterNode -Class Win32_OperatingSystem).FreePhysicalMemory / 1MB), 0)
        [int]$TotalFreeMemory = [int]$TotalFreeMemory + [int]$FreeMemory
        [int]$NodeMemory = [math]::round(((Get-WmiObject -ComputerName $ClusterNode -Class Win32_OperatingSystem).TotalVisibleMemorySize / 1MB), 0)
        [int]$TotalMemory = [int]$TotalMemory + [int]$NodeMemory

    }

    $TotalAvailableMemory = $TotalFreeMemory - $NodeMemory
 
    "Cluster: $Cluster" | out-file -filepath $logfile -append
    "Total Memory: $TotalMemory" | out-file -filepath $logfile -append
    "Total Free Memory: $TotalFreeMemory" | out-file -filepath $logfile -append
    "Total Available Memory: $TotalAvailableMemory" | out-file -filepath $logfile -append
    " " | out-file -filepath $logfile -append
    "CSV Freespace : " | out-file -filepath $logfile -append
    GetCSVFreeSpace | out-file -filepath $logfile -append
    " " | out-file -filepath $logfile -append
}
SentReportviaMail

example output mail:

Disclaimer: Please read, understand and test script before you run put in production! This should just give you an idea around the power of powershell and automation