【问题标题】:Inconsistent powershell script不一致的powershell脚本
【发布时间】:2017-01-09 16:13:28
【问题描述】:

我正在使用一个脚本,它对平均 CPU 和内存利用率执行基本健康检查,并检查特定服务是否正在运行。输出将显示为 HTML。如果 CPU/Memory 利用率大于 89%,或者如果服务没有运行,则受影响的服务器将显示为红色。该脚本工作正常,除了一些不一致的地方,服务器即使在未充分利用时也会显示为红色。

这是我正在使用的 powershell 脚本:

$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

谢谢!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    当您真正对数字比较感兴趣时,不要使用字符串比较 - 数字字符串的序数与其对应的数字的序数不相等。考虑以下比较操作:

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

    首先,将结果对象更改为以数字形式携带百分比:

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

    然后更改if 语句以将它们作为数字进行比较:

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

    最后,在最终输出中添加% 符号:

     $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>" 
    

    【讨论】:

    • 我将结果与数字进行了比较,我得到了我想看到的结果。但是,在最终输出中添加 th % 符号不会显示我想看到的结果。无论如何,我做了一个解决方法,只是在列名中添加了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2022-01-23
    • 2019-11-09
    • 2017-03-29
    • 2011-10-12
    • 2012-06-03
    • 2013-04-15
    相关资源
    最近更新 更多