1

I am using a script that performs a basic health check on average CPU and Memory Utilization and checks if a specific service is running or not. The output will be displayed as HTML. If the CPU/Memory utilization is greater than 89%, or if ther service is not running, the affected server will be displayed in red. The script works just fine except for some inconsistencies that the server, even when under utilized, will be in red.

Here is the powershell script I am using:

$ServerListFile = "C:\Scripts\HealthCheck\ServerList.txt"
$ServerList = Get-Content $ServerListFile -ErrorAction SilentlyContinue
$Date = Get-Date -Format M.d.yyyy
$Result = @()

foreach ($computername in $ServerList) {

    $AVGProc = Get-WmiObject -ComputerName $computername Win32_Processor |
        Measure-Object -Property LoadPercentage -Average |
        Select-Object Average
    $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computername |
        Select-Object @{Name = "MemoryUsage"; Expression = {"{0:N2}" -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize) }}
    $Service1 = Get-Service -ComputerName $computername -Name Service1
    $Service2 = Get-Service -ComputerName $computername -Name Service2

    $Result += [PSCustomObject] @{  
        ServerName = "$computername" 
        CPULoad    = "$($AVGProc.Average)%" 
        MemLoad    = "$($OS.MemoryUsage)%"
        Service1   = "$($Service1.Status)" 
        Service2   = "$($Service2.Status)"
    }

    $Outputreport = "<HTML><TITLE> Server Health Check </TITLE> 
                     <BODY background-color:peachpuff> 
                     <font color =""#99000"" face=""Microsoft Tai le""> 
                     <H2> Server Health Check </H2></font> 
                     <Table border=1 cellpadding=7 cellspacing=0> 
             <font face=""Calibri"">
                     <TR bgcolor=white align=center> 
                       <TD><B> Server Name </B></TD> 
                       <TD><B> Avrg.CPU  </B></TD> 
                       <TD><B> Memory  </B></TD>
                   <TD><B> Service1 </B></TD>
                       <TD><B> Service2</B></TD></TR>"

    foreach ($Entry in $Result) {
        if (($Entry.MemLoad -gt "89") -Or ($Entry.CPULoad -gt "89") -or ($Entry.Service1 -eq "Stopped") -or ($Entry.Service2 -eq "Stopped")) {
            $Outputreport += "<TR bgcolor=red>"
        } else { 
            $Outputreport += "<TR bgcolor=lightgreen>"
        }
        $Outputreport += "<TD>$($Entry.Servername)</TD><TD align=center>$($Entry.CPULoad)</TD><TD align=center>$($Entry.MemLoad)</TD><TD align=center>$($Entry.Service1)</TD><TD align=center>$($Entry.Service2)</TD></TR>" 
    }

    $Outputreport += "</Table></BODY></HTML>"
}

$Outputreport | Out-File C:\Scripts\HealthCheck\ServerHealthCheck\HealthCheck_$Date.htm

Thanks!

1 Answer 1

3

Don't use string comparisons when you're really interested in a numerical comparison - the ordinality of a string of digits is not equal to that of it's numerical counterpart. Consider the following comparison operations:

PS C:\> 9 -gt 89
False
PS C:\> "9" -gt "89"
True

First, change the result objects to carry the percentages as numbers instead:

$Result += [PSCustomObject] @{
    ServerName = "$computername" 
    CPULoad = $AVGProc.Average 
    MemLoad = $OS.MemoryUsage
    Service1 = "$($Service1.Status)" 
    Service2 = "$($Service2.Status)"
}

Then change the if statement to compare them as numbers:

if (($Entry.MemLoad -gt 89) -Or ($Entry.CPULoad -gt 89) -or ($Entry.Service1 -eq "Stopped") -or ($Entry.Service2 -eq "Stopped"))

And then finally, add the % sign in the final output:

 $Outputreport += "<TD>$($Entry.Servername)</TD><TD align=center>$($Entry.CPULoad)%</TD><TD align=center>$($Entry.MemLoad)%</TD><TD align=center>$($Entry.Service1)</TD><TD align=center>$($Entry.Service2)</TD></TR>" 
Sign up to request clarification or add additional context in comments.

1 Comment

I compared the results as numbers and i am getting the result i want to see. However, adding th % sign in the final output is not displaying the result i want to see. Anyway, i did a workaround and just added the in the column name. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.