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

时间:2015-07-03 00:48:40

标签: powershell

我有一个监视脚本,由任务调度程序每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分钟运行一次,无论安静时间如何,因为它记录了发现问题的日志。改变时间表将无法实现这一目标。

2 个答案:

答案 0 :(得分:3)

$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

}

答案 1 :(得分:0)

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

}