我有一个 bat 文件,我想在每个季度的特定日期/时间运行一年。我是命令行新手,我知道如何通过任务调度程序运行它,这很容易。
假设对于每个季度,第 1 个月和第 2 个月,我的 bat 文件应该在其他周运行。对于一个季度的第三个月,它应该每周运行一次。可能的时间是清晨 6:00 am 我该怎么做?请告诉我。谢谢。
我有一个 bat 文件,我想在每个季度的特定日期/时间运行一年。我是命令行新手,我知道如何通过任务调度程序运行它,这很容易。
假设对于每个季度,第 1 个月和第 2 个月,我的 bat 文件应该在其他周运行。对于一个季度的第三个月,它应该每周运行一次。可能的时间是清晨 6:00 am 我该怎么做?请告诉我。谢谢。
下面的批处理文件做你想做的事:
@echo off
rem Get the "monthInQuarter@weekInMonth" value of the last run:
set /P lastRun=< scheduler.txt
rem Get values from today date
for /F "tokens=1,2 delims=/" %%a in ("%date%") do (
set /A "monthInQuarter=(1%%a-100)%%4, weekInMonth=(1%%b-101)/7+1, oddWeekInMonth=weekInMonth%%2"
)
if %weekInMonth% gtr 4 (
set /A weekInMonth=4, oddWeekInMonth=0
)
set thisRun=%monthInQuarter%@%weekInMonth%
rem For 1st and 2nd month in each quarter:
if %monthInQuarter% leq 2 (
rem For alternative weeks (1=yes, 2=no, 3=yes, 4=no):
if %oddWeekInMonth% equ 1 (
if "%thisRun%" neq "%lastRun%" (
echo %thisRun%> scheduler.txt
call :TheProcess
)
)
rem For the third month of a quarter:
) else if %monthInQuarter% equ 3 (
rem Run it weekly:
if "%thisRun%" neq "%lastRun%" (
echo %thisRun%> scheduler.txt
call :TheProcess
)
)
exit
:TheProcess
rem Place here the desired process, ie:
echo This run only on selected weeks!
exit /B
此值表可能有助于理解调度逻辑:
month: 1 2 3 4 5 6 7 8 9 10 11 12
monthInQuarter: 1 2 3 0 1 2 3 0 1 2 3 0
day: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
weekInMonth: 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 ...
oddWeekInMonth: 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 ...
笔记:
此批处理文件假定 ECHO %DATE% 命令以 MM/DD/YYYY 格式显示日期,如果月或日小于 10,则左零。如果这不是您的区域设置日期格式,则需要稍作修改。
尽管可以修改此程序以使用任何日期格式,但我认为这不是通用文件,而是针对您的特定需求的非常特殊的要求。
该程序必须每天早上 6:00 通过任务调度程序运行。
程序第一次运行“系统找不到指定的文件”。在创建辅助 SCHEDULE.TXT 文件之前出现消息。
我希望它有所帮助。
安东尼奥
PS - 我不认为这个问题可以通过 vbs 脚本或 C#、JAVA 等以更简单的方式解决......
有windows scheduler,但我怀疑您是否能够仅使用 windows scheduler 进行高级调度。
我要做的是用某种高级语言(C#、JAVA 等)编写调度逻辑(例如,当您希望批处理文件运行时),然后在批处理文件的开头调用该程序以查看它是否是你关心的日期。
可以使用 Windows 调度程序将批处理文件设置为每天运行(如果需要,每天运行多次),但只有当您的 C#/JAVA 程序表明这是您关心的日期时,它才会执行“真正的工作” .
公共静态 void main(String[] args) 抛出异常 {
String hours=PropertyUtil.getProperty("START_HOURS");
String minutes=PropertyUtil.getProperty("START_MINUTES");
String hours1=PropertyUtil.getProperty("SECOND_START_HOURS");
String minutes1=PropertyUtil.getProperty("SECOND_START_MINUTES");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hours));
calendar.set(Calendar.MINUTE, Integer.parseInt(minutes));
calendar.set(Calendar.SECOND, 00);
Long currentTime = new Date().getTime();
System.out.println("Current time is : "+currentTime);
//Check if current time is greater than our calendar's time. If So, then change date to one day plus. As the time already pass for execution.
if (calendar.getTime().getTime() < currentTime) {
calendar.add(Calendar.DATE, 1);
}
Date time = calendar.getTime();
long period = 1000L 60L 60L * 24L; // 24 Hours
System.out.println(" First run time is : "+time);
System.out.println("milli seconds: "+period);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
System.out.println(" Service Started...."+new Date());
//main logic
System.out.println("service completed...."+new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}, time, period);
Calendar calendar1 = Calendar.getInstance();
calendar1.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hours1));
calendar1.set(Calendar.MINUTE, Integer.parseInt(minutes1));
calendar1.set(Calendar.SECOND, 00);
//Check if current time is greater than our calendar's time. If So, then change date to one day plus. As the time already pass for execution.
if (calendar1.getTime().getTime() < currentTime) {
calendar1.add(Calendar.DATE, 1);
}
Date time1 = calendar1.getTime();
System.out.println("Second run Time is : "+time1);
System.out.println("Milli seconds : "+period);
Timer timer1 = new Timer();
timer1.schedule(new TimerTask() {
@Override
public void run() {
try {
System.out.println(" Service Started...."+new Date());
//main logic
System.out.println("service completed...."+new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
}, time1, period);
}