如何检查数组中是否有大于9000的成员?



我需要编写一个脚本,当整个数组中有一个成员大于9000时执行操作。

$all = 1,10,999,1990,2002,9101,5000,12,500
    foreach($cauta in $all){
        if($cauta -gt 7000){
            Send-MailMessage -To me@myemail.com -From alert@myemail.com -Subject "CRITICAL load" 
        }
        else{
            Send-MailMessage -To me@myemail.com -From alert@myemail.com -Subject "OK load" 
        }
}

问题是,有了这个foreach,它会不断地给我发邮件。我需要收到一封状态为"OK"或"CRITICAL"的邮件:如果array成员数大于9000 ->发送一封紧急邮件。

如果数组的所有成员都低于9000 ->发送一封状态为ok的邮件。

这似乎是Measure-Object的完美案例。使用-Maximum开关,我们可以返回最大的数组元素,因为它们是整数。

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

没有意义逐个循环检查所有元素。

另外,正如wOxxOm提醒我的,-gt作为数组操作符工作。你可以这样使用它

$all -gt 7000

返回所有大于7000的元素。如果没有匹配,则返回Null。如果你测试结果作为布尔值有相同的效果。

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

使用这种方法要小心,因为如果数组中有字符串,它也可能返回它们。使用Measure-Object将考虑到这一点,并将整型字符串视为整数。仍然可以用真实的字符串失败,要注意你的数据类型!

你真的不需要这个循环。Powershell的关系操作符处理数组。例如,你可以输入:

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

如果你这样做

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

$large将被分配一个只包含大于或等于5000的值的数组。Powershell将任何非空数组视为真值,使第一个示例工作…

你可以这样做

$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 me@myemail.com -From alert@myemail.com -Subject $subject

我建议你使用Measure-Object,但是如果你想在你的代码中处理它,就把它改成如下:

$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 me@myemail.com -From alert@myemail.com -Subject "CRITICAL load" 
}
else{
Send-MailMessage -To me@myemail.com -From alert@myemail.com -Subject "OK load"
}

最新更新