检查可能跨越日期边界的时间跨度



我有一个监控脚本,任务调度程序每5分钟执行一次。如果脚本确定存在问题,则会引发警报条件并发送通知电子邮件。然后脚本终止。一切都很好。

我想定义一些"安静时间",在此期间,监控仍按计划进行,但通知被抑制。这几个小时将越过午夜边界。

我可以用这样的东西来做:

$quietHoursStart = "22:00"
$quietHoursEnd = "06:00"
$timeNow = Get-Date
if ( $timeNow -lt (Get-Date $quietHoursStart ) -and
     $timeNow -gt (Get-Date $quietHoursEnd ) ) {
     Send-NotificationEmail
}

这很好,但如果我重新定义安静时间范围,使其不超过午夜边界(例如00:00->06:00(,那么通知将始终失败,因为if条件永远不可能为真。

如果可以添加额外的测试,看看范围是否超过午夜,然后进行两次单独的检查,看看当前时间是否"安静",但我觉得应该有一个更优雅的解决方案。

安静时间开始/结束的值实际上是从XML配置文件中提取的,但为了清晰起见,上面的示例使用了简单的定义。

编辑:澄清;该脚本必须每5分钟运行一次,而不考虑静默时间,因为它会记录所发现问题的日志。改变时间表不会达到这个目的。

添加$quietHoursStart$quietHoursEnd之间的比较,以检查给定的间隔是否跨越午夜。

$quietHoursStart = "22:00"
$quietHoursEnd = "06:00"
$timeNow = Get-Date
$TimeOfDay = $timeNow.TimeOfDay
$IsQuietHours = if ( $quietHoursStart -le $quietHoursEnd ) {
    $TimeOfDay -ge $quietHoursStart -and $TimeOfDay -lt $quietHoursEnd
} else {
    $TimeOfDay -ge $quietHoursStart -or $TimeOfDay -lt $quietHoursEnd
}
if ( !$IsQuietHours ) {
     Send-NotificationEmail
}

Alain O'Dea的链接确实很好地满足了您的需求,但从脚本的角度来看,我认为更好的方法(从脚本角度来看,他与调度任务的链接可能更好(是定义开始时间,然后定义持续时间。所以你想让它从晚上10点开始一直持续到早上6点?这是一个8小时的持续时间。此外,我会测试它是否在你的安静时间,然后用-Not(我使用别名!(将其反转

$quietHoursStart = "22:00"
$quietHoursDuration = 8
$timeNow = Get-Date
if (! ($timeNow -gt (Get-Date $quietHoursStart ) -and $timeNow -lt (Get-Date $quietHoursStart ).AddHours($quietHoursDuration)) ) {
     Send-NotificationEmail
}

最新更新