【发布时间】:2015-03-22 19:28:02
【问题描述】:
我必须编写一个应用程序,我可以在其中定义程序以在特定时间、特定日期和特定时间间隔运行。
A.exe 必须在每个月的第 1 天和第 15 天上午 8:00 运行。
B.exe 必须在每月 16 日和 31 日上午 8:30 运行。如果 月没有 31 天,然后在最后一个运行第 31 个实例 一个月的一天。
- C.exe 必须在每个星期一和第三个星期一运行 每月上午 9:00
- D.exe 必须在每个工作日的凌晨 4:00 和每 30 点运行一次 之后几分钟直到晚上 11:00。
我需要能够查看每个任务的 LastRunTime 并找出 NextRunTime。
我正在寻找有关如何最好地编写此算法的建议/指导。我正在考虑解析如下输入字符串:
DayOfMonth=1,15;StartTime=00:00:01;EndTime=23:59:59;Interval=1:30:00
or
DayOfWeek=Mon,1,3|Wed,2,4;StartTime=00:00:01;EndTime=23:59:59;Interval=1:30:00
or
DayOfWeek=Mon|Tue|Wed|Thu|Fri;StartTime=08:00:00;EndTime=23:00:00;Interval=00:30:00
第二个字符串表示每个月的第一个和第三个星期一以及每个月的第二个和第四个星期三。
第三个字符串基本上是每个工作日。
我会让用户界面允许用户设置参数,它会生成字符串以传递给任务处理程序。
我已经开始编写代码来解析“DayOfMonth”字符串,它未经测试,我意识到如果月份的天数少于它应该运行的天数,它没有考虑到。这里是:
Private Sub GetNextRuntime()
Dim st As Date
If ScheduleValue("DayOfMonth") <> "" Then
For Each s As String In ScheduleValue("DayOfMonth").Split(",")
If IsNumeric(s) Then
If CInt(s) >= Now.Day Then
If IsDate(ScheduleValue("StartTime")) Then
st = CDate(ScheduleValue("StartTime"))
If st.TimeOfDay >= Now.TimeOfDay Then
NextRunTime = New Date(st.Year, st.Month, st.Day, st.Hour, st.Minute, st.Second)
Exit Sub
ElseIf LastRunTime.Date <> Now.Date Then
NextRunTime = New Date(Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second).AddMinutes(Rnd(0, 59))
Exit Sub
End If
Else
Throw New Exception("Invalid StartTime value for Task id " & TaskId)
End If
End If
Else
Throw New Exception("Invalid DayOfMonth value in Task Id " & TaskId)
End If
Next
st = CDate(ScheduleValue("StartTime"))
NextRunTime = New Date(Now.Year, Now.Month, CInt(ScheduleValue("DayOfMonth").Split(",")(0)), st.Hour, st.Minute, st.Second).AddMonths(1)
End If
End Sub
Private Function ScheduleValue(ByVal ParamName As String) As String
With New Regex(ParamName & "=(?<Value>.*?);")
If .IsMatch(Schedule) Then
ScheduleValue = .Match(Schedule).Groups("Value").Value
Else
ScheduleValue = ""
End If
End With
End Function
感谢任何指导。
【问题讨论】:
-
我将补充一点,应用启动程序将从数据库获取模拟凭据并使用这些凭据启动任务。它将在自动登录的电脑上设置,并在启动时启动。这是因为我们希望看到正在运行的应用(所有控制台应用)。