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

Powershell 检查可能跨越日边界的时间跨度,powershell,Powershell,我有一个监控脚本,任务调度器每5分钟执行一次。如果脚本确定存在问题,则会引发警报条件并发送通知电子邮件。然后脚本终止。一切都很好 我想定义一些“安静时间”,在此期间,监控仍按计划进行,但通知被抑制。这些时间将跨越午夜边界 我可以这样做: $quietHoursStart = "22:00" $quietHoursEnd = "06:00" $timeNow = Get-Date if ( $timeNow -lt (Get-Date $quietHoursStart ) -and $

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

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

我可以这样做:

$quietHoursStart = "22:00"
$quietHoursEnd = "06:00"
$timeNow = Get-Date

if ( $timeNow -lt (Get-Date $quietHoursStart ) -and
     $timeNow -gt (Get-Date $quietHoursEnd ) ) {

     Send-NotificationEmail

}
$quietHoursStart = "22:00"
$quietHoursDuration = 8
$timeNow = Get-Date

if (! ($timeNow -gt (Get-Date $quietHoursStart ) -and $timeNow -lt (Get-Date $quietHoursStart ).AddHours($quietHoursDuration)) ) {

     Send-NotificationEmail

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

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

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


编辑:澄清;该脚本必须每5分钟运行一次,而不考虑安静时间,因为它会记录所发现问题的日志。改变日程安排并不能实现这一点。

阿兰·奥黛的链接确实很好地满足了您的需求,但从注重脚本的角度来看,我认为更好的方法是定义开始时间,然后是持续时间(从脚本角度看,他与安排任务的链接可能更好)。所以你想在晚上10点开始,一直持续到早上6点?这是一个8小时的持续时间。另外,我会测试它是否在您的安静时间,然后使用
-Not
(我使用别名
)将其反转,尝试以下操作:

$quietHoursStart = "22:00"
$quietHoursEnd = "06:00"
$timeNow = Get-Date

if ( $timeNow -lt (Get-Date $quietHoursStart ) -and
     $timeNow -gt (Get-Date $quietHoursEnd ) ) {

     Send-NotificationEmail

}
$quietHoursStart = "22:00"
$quietHoursDuration = 8
$timeNow = Get-Date

if (! ($timeNow -gt (Get-Date $quietHoursStart ) -and $timeNow -lt (Get-Date $quietHoursStart ).AddHours($quietHoursDuration)) ) {

     Send-NotificationEmail

}

$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

}

可能的误解。我需要脚本始终触发(以便它可以记录问题)。我只想在某些时间内取消通知。如果timeNow是午夜后但在安静时间结束之前,这种情况是否仍然有效?我认为第一个IF子句为FALSE,第二个子句为TRUE,然后结果为FALSE,反转为TRUE,并发送通知……是的,在OP的评论指出我(即将删除)答案中的缺陷后,我正在做类似的事情,但我很难确认我头脑中的一切。干得好是的,我想这可能是最整洁的方式。谢谢。我可以建议将两个
-le
运算符更改为
-lt
?就目前情况而言,如果安静时间的结束时间是06:00,而现在正好是06:00,那么这将算作安静时间。@dan gph是的,这样可能会更好,但很难让确切的
06:00:00.0000000
真正造成任何差异。@PetSerAl同意,但是它触发了我的强迫症:)我想你可以在单元测试中准确地得到
06:00:00.0000000