2

I have writtern a script which will take the servers details from a text file and export the Disk space, RAM and CPU utilization details for multiple servers and the script is working a expected. right now my script will send eamil with the report as below.

enter image description here

Can someone help me to get the required output: the Function name column need to be included in my output report beside the Server name so that it will be easily identified like which is respective servers.

I can use the excel sheet as below, please help me on how to use that excel sheet in my script to get the required output.

enter image description here

CODE

## Set Root Location
Set-Location $PSScriptRoot

# Continue even if there are errors 
$ErrorActionPreference = "Continue"; 
 
# Set your warning and critical thresholds 
$percentWarning = 100; 
$percentCritcal = 30; 
 
# REPORT PROPERTIES 
 # Path to the report 
  $reportPath = "$PSScriptRoot\"; 
 
 # Report name 
  $reportName = "DiskSpaceRpt_$(get-date -format ddMMyyyy).html"; 
 
# Path and Report name together 
$diskReport = $reportPath + $reportName 
 
#Set colors for table cell backgrounds 
$redColor = "#FF0000" 
$orangeColor = "#FBB917" 
$whiteColor = "#FFFFFF" 
 
# Count if any computers have low disk space.  Do not send report if less than 1. 
$i = 0; 
 
# Get computer list to check disk space 
$computers = Get-Content ".\Servers.txt"; 
$datetime = Get-Date -Format "MM-dd-yyyy_HHmmss"; 
 
# Remove the report if it has already been run today so it does not append to the existing report 
If (Test-Path $diskReport) 
    { 
        Remove-Item $diskReport 
    } 
 
# Cleanup old files.. 
$Daysback = "-7" 
$CurrentDate = Get-Date; 
$DateToDelete = $CurrentDate.AddDays($Daysback); 
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item; 
 
# Create and write HTML Header of report 
$titleDate = get-date -uformat "%m-%d-%Y - %A" 
$header = " 
  <html> 
  <head> 
  <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> 
  <title>DiskSpace Report</title> 
  <STYLE TYPE='text/css'> 
  <!-- 
  td { 
   font-family: Calibri; 
   font-size: 12px; 
   border-top: 1px solid #999999; 
   border-right: 1px solid #999999; 
   border-bottom: 1px solid #999999; 
   border-left: 1px solid #999999; 
   padding-top: 0px; 
   padding-right: 0px; 
   padding-bottom: 0px; 
   padding-left: 0px; 
  } 
  body { 
   margin-left: 5px; 
   margin-top: 5px; 
   margin-right: 0px; 
   margin-bottom: 10px; 
   table { 
   border: thin solid #000000; 
  } 
  --> 
  </style> 
  </head> 
  <body> 
  <table width='100%'> 
  <tr bgcolor='#548DD4'> 
  <td colspan='7' height='30' align='center'> 
  <font face='calibri' color='#eef4f0' size='5'><strong>Disk Space Daily Report for $titledate</strong></font> 
  </td> 
  </tr> 
  </table> 
" 
 Add-Content $diskReport $header 
 
# Create and write Table header for report 
 $tableHeader = " 
 <table width='100%'><tbody> 
 <tr bgcolor=#deedf0> 
 <td width='17%' align='center'<b>Server</b></td> 
 <td width='5%'  align='center'><b>Drive</b></td> 
 <td width='12%' align='center'><b>Drive Label</b></td> 
 <td width='10%' align='center'><b>Total Capacity(GB)</b></td> 
 <td width='10%' align='center'><b>Used Capacity(GB)</b></td> 
 <td width='10%' align='center'><b>Free Space(GB)</b></td> 
 <td width='6%'  align='center'><b>Freespace %</b></td> 
 <td width='5%'  align='center'><b>RAM %</b></td>
  <td width='5%'  align='center'><b>CPU %</b></td>
 </tr> 
" 
Add-Content $diskReport $tableHeader 
  
# Start processing disk space 
  foreach($computer in $computers) 
 {  
 $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
 $computer = $computer.toupper() 
  foreach($disk in $disks) 
 {         
  $deviceID = $disk.DeviceID; 
        $volName = $disk.VolumeName; 
  [float]$size = $disk.Size; 
  [float]$freespace = $disk.FreeSpace;  
  $percentFree = [Math]::Round(($freespace / $size) * 100); 
  $sizeGB = [Math]::Round($size / 1073741824, 2); 
  $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2); 
        $usedSpaceGB = $sizeGB - $freeSpaceGB; 
        $color = $whiteColor; 
# Start processing RAM      
  $RAM = Get-WmiObject -ComputerName $computer -Class Win32_OperatingSystem
    $RAMtotal = $RAM.TotalVisibleMemorySize;
    $RAMAvail = $RAM.FreePhysicalMemory;
        $RAMpercent = [Math]::Round(($RAMavail / $RAMTotal) * 100);

# Start processing CPU
 $CPUpercent = Get-WmiObject -ComputerName $computer -Class win32_processor | 
 Measure-Object -property LoadPercentage -Average | Select-Object -ExpandProperty Average
        
# Set background color to Orange if just a warning 
 if($percentFree -lt $percentWarning)       
  { 
    $color = $orangeColor  
 
# Set background color to Orange if space is Critical 
      if($percentFree -lt $percentCritcal) 
        { 
        $color = $redColor 
       }         
  
 # Create table data rows  
    $dataRow = " 
  <tr> 
        <td width='10%'>$computer</td> 
  <td width='5%' align='center'>$deviceID</td> 
  <td width='10%' >$volName</td> 
  <td width='10%' align='center'>$sizeGB</td> 
  <td width='10%' align='center'>$usedSpaceGB</td> 
  <td width='10%' align='center'>$freeSpaceGB</td> 
  <td width='5%' bgcolor=`'$color`' align='center'>$percentFree</td> 
  <td width='5%' align='center'>$RAMpercent</td>
  <td width='5%' align='center'>$CPUpercent</td>
  </tr> 
" 
Add-Content $diskReport $dataRow; 
Write-Host -ForegroundColor DarkYellow "$computer $deviceID percentage free space = $percentFree"; 
    $i++   
  } 
 } 
} 

# Create table at end of report showing legend of colors for the critical and warning 
 $tableDescription = " 
 </table><br><table width='20%'> 
 <tr bgcolor='White'> 
    <td width='10%' align='center' bgcolor='#FBB917'>No Warning</td> 
 <td width='10%' align='center' bgcolor='#FF0000'>Critical less than 10% free space</td> 
 </tr> 
" 
 Add-Content $diskReport $tableDescription 
 Add-Content $diskReport "</body></html>" 

 $Finalreport = get-content $diskReport 

#########################Send Email with All Disk Space Reports###############
Send-MailMessage @hash
chandu
  • 83
  • 1
  • 11
  • try to simplify your code to do ONLY what your Question asks about. if you have not done so yet, please read the Tour page for this site. your reputation score indicates that you have not. ///// also, convert your image of data into text - and sanitize it as needed. right now your two data files don't have any linking value ... and i suspect that your real data has the same server names. – Lee_Dailey Apr 13 '22 at 17:37
  • Not getting what you are saying – chandu Apr 13 '22 at 17:41
  • from the text of your Question >>> `But my question is like i want get the Function name column as well in the output report beside the Server name so that it will be easily identified like which is respective servers.` <<< your code and data should only cover that. keep things limited to the specifics ... as the Tour page instructs on `How to ask a Good Question`. [*grin*] – Lee_Dailey Apr 13 '22 at 17:54
  • Edited my question – chandu Apr 13 '22 at 17:56
  • Hi @chandu, are you able to get the Excel spreadsheet as csv rather than Excel? I think with CSV, you could join the data more easily from the two with some conditional logic and perhaps a loop to create the HTML before sending it via email. I'd start by playing with it dumping to an HTML file and opening that to see it while I iron it out. Then once that's set, run the logic to send HTML in the email body. – Vomit IT - Chunky Mess Style Apr 13 '22 at 18:02
  • @VomitIT-ChunkyMessStyle Can you please help me with the script if possible – chandu Apr 14 '22 at 05:12
  • What part of the code are you using to import in the Excel spreadsheet? Do you not know about that part or the part to join values from it into the HTML? Here's a post with some solution that may help https://stackoverflow.com/questions/52970246/select-excel-row-create-hashtable-from-entries. You have more code in your script than I have time to breakdown to figure out what specifically you need help with. If you could narrow down the focus and give some starting points for the concise areas you need help, I may have time later. As is, I just don't have time to help much more at the moment. – Vomit IT - Chunky Mess Style Apr 14 '22 at 20:40
  • I want import the data from excel which have Server Name and Function columns and for all those server i need to get the Disk space report with RAM and CPU details for each and every drive. Once all the details are exported to excel, now i need to filter out the Disk space values which are less than 30 % and add those into a HTML report and attach the excel sheet in the mail and use that HTML report in the email body – chandu Apr 15 '22 at 05:49
  • @VomitIT-ChunkyMessStyle Can you please help me to acheive the output – chandu Apr 18 '22 at 17:48

1 Answers1

0

Bring the Excel sheet into the script (well supported in Powershell) as a hashtable with servername as the key and function as the value, then simply add an additional column using the servernames to look up the function.

ejkeep
  • 101
  • 1
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Apr 13 '22 at 19:50
  • Can you please help me with the script if possible – chandu Apr 14 '22 at 05:11
  • What part do you need help with? Adding the column, the excel import, or what? – ejkeep Apr 15 '22 at 14:45
  • The excel import and print the details of the server which have less space in the email body – chandu May 04 '22 at 14:14