我需要编写一个脚本,当整个数组中有一个成员大于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 ->发送一封紧急邮件。
这似乎是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"
}