2016-09-12 3 views
2

Ich brauche ein Skript zu machen, die Maßnahmen ergreift, wenn ein Mitglied des gesamten Arrays größer als 9000.Wie kann ich überprüfen, ob ein Mitglied eines Arrays größer als 9000

$all = 1,10,999,1990,2002,9101,5000,12,500 
    foreach($cauta in $all){ 
     if($cauta -gt 7000){ 
      Send-MailMessage -To [email protected] -From [email protected] -Subject "CRITICAL load" 
     } 
     else{ 
      Send-MailMessage -To [email protected] -From [email protected] -Subject "OK load" 
     } 
} 

Das Problem ist, mit dieser foreach sendet es mir ständig E-Mails. Ich brauche eine E-Mail mit „OK“ oder „critical“ -Status erhalten: Wenn einer der Array-Mitgliedern größer als 9000 -> eine E-Mail mit einem kritischen Status senden. Wenn alle Mitglieder des Arrays unter 9000 sind -> senden Sie eine E-Mail mit OK-Status.

+2

verwenden Sie einfach 'Measure-Object'? 'if (($ all | Measure-Object -Maximum) .Maximum -gt 7000) {" kritisch "} else {" ok "}'. So ist es von entscheidender Bedeutung, wenn es mindestens eine über 7000. – Matt

Antwort

1

Sie nicht wirklich brauchen die Schleife. Die relationalen Operatoren von Powershell arbeiten mit Arrays. So zum Beispiel können Sie Folgendes eingeben:

$all = 1,10,999,1990,2002,9101,5000,12,500 
if ($all -gt 9000) { echo "too big..." } 

Wenn Sie das tun

$large = $all -ge 5000 
if ($large) { echo "These are too big: $large" } 

große $ wird ein Array mit nur die Werte, die größer als oder gleich 5000. Powershell behandelt jede nicht leere Array zugewiesen bekommen als trueish, so dass das erste Beispiel der Arbeit ...

+0

Wow .. .diese einfache Antwort bläst mich. Ich habe nicht erwartet, dass das funktioniert. Ich danke dir sehr. – catalin

+0

@cata Dies war in meiner Antwort bereits ...... – Matt

+0

Beachten Sie, dass dies für Integer-Arrays funktioniert, aber das Vorhandensein von Strings oder anderen Objekten, kann damit zu tun haben. – Matt

1

Sie können wie etwas tun

$all = 1, 10, 999, 1990, 2002, 9101, 5000, 12, 500 
$subject = "OK load" 
foreach ($cauta in $all) 
{ 
    if ($cauta -gt 7000) 
    { 
     $subject = "CRITICAL load" 
    } 
} 
Send-MailMessage -To [email protected] -From [email protected] -Subject $subject 
+0

Gute Idee nimmt die E-Mail-Cmdlets aus der Schleife ist aber immer noch unnötige Zyklen haben würde. – Matt

5

Das für Measure-Object wie ein perfekter Fall zu sein scheint. Unter Verwendung des -Maximum Schalters können wir das größte Array-Element zurückgeben, da sie Integer sind.

if(($all | Measure-Object -Maximum).Maximum -gt 7000){ 
    "critical" 
} else { 
    "ok" 
} 

Keine sinnvolle Schleifenprüfung aller Elemente einzeln.

Auch als wOxxOm mich erinnert, -gt Werke als Array-Operator. Sie können es einfach so verwenden ...

$all -gt 7000 

Was das tun werden, ist, alle Elemente zurück, die größer sind als 7000. Null zurückgegeben, wenn es keine Übereinstimmung gibt. Wenn Sie das Ergebnis als Boolean testen, haben Sie denselben Effekt.

if($all -gt 7000){ 
    "critical" 
} else { 
    "ok" 
} 

Mit diesem Ansatz vorsichtig, als ob Zeichenfolge in diesem Array ist es sie auch zurückkehren könnte. Die Verwendung von Measure-Object berücksichtigt dies und behandelt Integer-Strings als ganze Zahlen. Kann immer noch mit echten String um all Ihre Datentypen bewusst sein!

+1

Warum nicht 'if ($ all -gt 7000) {...}'? – wOxxOm

+0

@wOxxOm Mist .... Ich habe vergessen, es war ein Array-Operator. – Matt

+2

Offenbar '-gt' und' Maßnahme -maximum' unterschiedliche Ergebnisse liefern, wenn es Zahlen-as-Strings im Array ist. '@ ('8', 7000) -gt 7000' sagt, die 8 ist größer als 7000 und wird kritisch, während '@ (' 8 ', 7000) | messen -Maximum "wird sagen, die 7000 ist das Maximum und alles ist in Ordnung. (Ich vermute, das ist für diese Frage nicht wichtig, aber ich bin überrascht, dass sie sich anders verhalten) – TessellatingHeckler

1

Ich empfehle Ihnen, Measure-Object verwenden, aber wenn Sie es mit Ihrem Code Änderung an folgende behandeln möchten:

$greater = $false 
$all = 1,10,999,1990,2002,9101,5000,12,500 
foreach($cauta in $all){ 
    if($cauta -gt 7000){ 
     $greater = $true 
     break 
    } 
} 
if ($greater -eq $true){ 
Send-MailMessage -To [email protected] -From [email protected] -Subject "CRITICAL load" 
} 
else{ 
Send-MailMessage -To [email protected] -From [email protected] -Subject "OK load" 
} 
+0

Danke für den Kommentar, Bearbeitete die Antwort –

Verwandte Themen