2016-04-28 14 views
1

Ich habe eigentlich zwei Fragen Ich hoffe, jemand kann mir helfen.PowerShell WMI zeigt den gleichen Wert

Der Zweck dieses Skripts ist es, mir Sichtbarkeit zu geben, wenn Maschinen mit hoher Speicher- und CPU-Auslastung ausgeführt werden. Die Liste der Server ist in einer TXT-Datei namens ServerList1.txt definiert. Die Ergebnisse werden in eine HTML-Datei ausgegeben.

  1. Bitte beachten Sie den folgenden Code. Wenn Sie Ihre CPU auf einen Wert über 70% einstellen, sollte das Skript anzeigen, welcher Rechner die 70% -Marke überschritten hat. Derzeit, wenn ich eine Maschine auf 100% CPU einstelle, zeigt es 100 $ für ALLE aufgelisteten Maschinen an. Irgendeine Idee warum? Ich kratze mich seit einiger Zeit daran.

  2. Bezogen auf die obigen, wenn eine Maschine einen Wert höher als 70% erreicht, sollte die Tabelle Zelle mit rot füllen. gerade jetzt wird es alle Zellen mit rot füllen. Ich vermute, sobald ich herausfinden kann, warum es 100% für alle Maschinen zeigt, sollte sich dieses Problem auch selbst korrigieren und die Zelle nur für eine bestimmte Maschine als rot markieren.

Unten ist der Code: (. Ja, es ist ein wenig schlampig Ich versuche gerade jetzt die Dinge arbeiten)

  $ServerListFile = "C:\Monitor\ServerList1.txt" 
      $ServerList = Get-Content $ServerListFile -ErrorAction SilentlyContinue 
      $GetDate = (Get-Date).ToString("dddd MMMM dd - hh:mm:ss tt")  
      $Result = @() 

      ForEach ($ComputerName in $ServerList) 
      { 
      ### Processor % 
      $Proc = Get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 
      $CPU = ($Proc.Readings -split ":")[-1] 
      $CPU = [math]::Round($CPU,2) 
      ### Memory % 
      $Memory = Get-WMIObject -Class Win32_OperatingSystem -Computername $ComputerName | Select-Object @{Name = "MemoryUsage"; Expression = {"{0:N2}" -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize)}} 
      $Memory = $Memory | Select-Object -ExpandProperty MemoryUsage 
      ### Create custom objects for report 
      $Result += [PSCustomObject] @{ 
      ServerName = "$ComputerName" 
      CPULoad = "$($CPU)%" 
      Memory = "$($Memory)%" 
      } 

      ### HTML formatting 
      $Report = " 
      <!DOCTYPE html> 
      <html> 
       <head> 
        <meta http-equiv=""refresh"" content=""1; URL=Test.htm"" /> 
        <link rel=""shortcut icon"" href=""favicon.png"" type=""image/x-icon"" /> 
        <title> Server Health Report</title> 
        <style> 

         html, body { 
          height: 100%; 
          background-color: #e6e6e6; 
         } 
         html { 
          display: table; 
          margin: auto; 
         } 

         body { 
          display: table-cell; 
          vertical-align: top; 
         } 
         p { 
          font-family: Microsoft Tai le; 
         } 
         h1 { 
          color: rgb(153,0,0); 
          text-align: center; 
          font-family: Microsoft Tai le; 
          font-size: 50px; 
         } 
         h2 { 
          color: rgb(153,0,0); 
          text-align: center; 
          font-family: Microsoft Tai le; 
          font-size: 30px; 
         } 
         td { 
          font-family: Microsoft Tai le; 
          font-size:24px; 
          padding:8px 12px; 
          border-style:solid; 
          border-width:1px; 
          /*overflow:hidden;*/ 
          word-break:normal; 
          border-color:#999; 
          color:#444; 
          border-top-width:1px; 
          border-bottom-width:1px; 
         } 
        </style> 
       </head> 
       <body> 
       <h1>Server Health Report</h1> 
       <h2>$GetDate</h2> 
       <table border=1 cellpadding=0 cellspacing=0> 
        <tr bgcolor=#00ace6 align=center> 
        <td><b>Server Name</b></td> 
        <td><b>CPU Utilization</b></td> 
        <td><b>Memory Utilization</b></td> 
       </tr>" 

       Foreach($Entry in $Result) 
        { 
         IF ($CPU -gt "70" -or $Memory -gt "70") 
          {       
           #$Report += "<tr bgcolor=#ff0000>" 
           $Report += "<trfont-color=#ff0000></font>" 
           $ReportDate = Get-Date -format "dddd MMMM dd - hh:mm:ss tt"       
           $ReportName = $Entry.Servername       
           $ReportCPU = $Entry.CPULoad       
           <#Write-Output "========== LOG ENTRY ==========" | Out-File C:\Monitor\Testmonitor.txt -Append       
           Write-Output "Timestamp: $ReportDate " | Out-File C:\Monitor\Testmonitor.txt -Append        
           Write-Output "Server Name: $ReportName" | Out-File C:\Monitor\Testmonitor.txt -Append       
           Write-Output "CPU Utilization: $ReportCPU" | Out-File C:\Monitor\Testmonitor.txt -Append        
           Write-Output "" | Out-File C:\Monitor\Testmonitor.txt -Append       
           Write-Output "" | Out-File C:\Monitor\Testmonitor.txt -Append#>     
          }      
         ELSE 
          { 
           $Report += "<tr>" 
          } 
         $Report += "<td align=center>$($Entry.Servername)</td> 
            <td align=center>$($Entry.CPULoad)</td> 
            <td align=center>$($Entry.Memory)</td> 
            </tr>" 
        } 
      $Report += "</table></body></html>" 
      } 

      $Report | Out-File C:\Monitor\Test.htm 

Antwort

1

Diese Linie, gerade innerhalb der Foreach($Entry in $Result) Schleife

IF ($CPU -gt "70" -or $Memory -gt "70") 

Dies verwendet die temporären Variablen aus der vorherigen Schleife, die Daten für nur das letzte Objekt im Array $Result enthalten. Die Linie, die Sie wollen, ist:

IF ($Entry.CPU -gt "70" -or $Entry.Memory -gt "70") 
+0

Vielen Dank @ Ryan-bemrose, habe ich gerade bemerkt, dass auch beim Überprüfen des Codes, aber es immer noch die gleiche Sache beim Umschalten. Ich habe es in 'IF ($ Entry.CPULoad -gt" 70% "-oder $ Entry.Memory -gt" 70% ") geändert, um meinen Code zu finden. Irgendwelche Ideen, warum es immer noch alle Maschinen bei 100% CPU zeigt? Ich werde einen weiteren Riss machen. – obs0lete

+0

D'oh! Ich habe das Problem gefunden. Ich habe folgende Variable gesetzt: '$ Proc = Get-counter -Counter" \ Prozessor (_Total) \% Prozessorzeit "-SampleInterval 1', der nicht darum gebeten hat, die Ergebnisse von einer Maschine zu bekommen. Hinzufügen von '$ Proc = Get-Zähler -Computer $ ComputerName-Counter" \ Prozessor (_Total) \% Prozessorzeit "-SampleInterval 1' funktioniert jetzt! – obs0lete

Verwandte Themen