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

3
我需要编写一个脚本,如果整个数组中的任意一个成员大于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”的电子邮件: 如果数组成员之一大于9000->发送一个带有严重状态的电子邮件。 如果数组的所有成员都小于9000->发送一个带有ok状态的电子邮件。

2
只需使用 Measure-Objectif( ($all | Measure-Object -Maximum).Maximum -gt 7000){"critical"}else{"ok"}。因此,如果至少有一个大于7000,则为关键。 - Matt
4个回答

5
这似乎是使用 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 可以解决这个问题,并将整数字符串视为整数。但当遇到真正的字符串时仍然可能失败,所以请注意你的数据类型!


1
为什么不使用 if ($all -gt 7000) { ... } - wOxxOm
2
显然,如果数组中有数字字符串,则“-gt”和“measure -maximum”会给出不同的结果。例如@('8', 7000) -gt 7000将显示8比7000大并且会发出警告,而@('8',7000) | measure -Maximum将显示7000是最大值,一切正常。(我怀疑这对这个问题没有影响,但我很惊讶它们的行为不同) - TessellatingHeckler
嗯,我想你可以更进一步,比较之前显式地将其转换为整数数组。为了安全起见,我会添加一个免责声明。 - Matt
[int[]]$all 嗯,我将其转换为int类型,这样字符串问题就不会发生 :) - catalin

3

不需要循环。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将任何非空数组视为trueish,使第一个示例起作用...

注:trueish指代布尔值为真或类似真的值,例如非零数字等。

哇...这个简单的答案让我惊呆了。我没想到它会起作用。非常感谢你。 - catalin
请注意,这适用于整数数组,但字符串或其他对象的存在可能会干扰它。 - Matt

1
你可以这样做:

$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

把邮件命令从循环中移出是个好主意,但这仍然会有不必要的循环。 - Matt

1
我建议您使用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"
}

感谢评论,已编辑答案。 - Farhad Farahi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接