2015-07-03 73 views
1

我有一個監控腳本,每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分鐘運行一次,而不管安靜的時間,因爲它記錄了發現的問題日誌。改變時間表不會實現這一點。

+0

http://stackoverflow.com/questions/4390617/windows-task-scheduler-run-only-during-window-of-time –

+0

可能的誤解。我需要腳本始終觸發(以便它可以記錄問題)。我只是想在特定的時間內抑制通知。 – andyb

回答

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 

} 
+0

是的,我正在處理OP的評論指出我的很快被刪除)的答案,但我很難確認我腦子裏的一切。做得好! – TheMadTechnician

+0

是的 - 我認爲這可能是最好的方式。謝謝。 – andyb

+0

不要覺得不好TheMadTechnician - 無論如何。 – andyb

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 

} 
+0

當timeNow是在午夜後,但在安靜的時間結束之前,它仍然適用於這種情況嗎?我認爲第一個IF子句將是FALSE,第二個子句是TRUE,然後AND結果爲FALSE,反轉爲TRUE,併發送通知... – andyb