1

我有一个 bat 文件,我想在每个季度的特定日期/时间运行一年。我是命令行新手,我知道如何通过任务调度程序运行它,这很容易。

假设对于每个季度,第 1 个月和第 2 个月,我的 bat 文件应该在其他周运行。对于一个季度的第三个月,它应该每周运行一次。可能的时间是清晨 6:00 am 我该怎么做?请告诉我。谢谢。

4

3 回答 3

3

下面的批处理文件做你想做的事:

@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 等以更简单的方式解决......

于 2012-06-14T09:41:30.880 回答
2

windows scheduler,但我怀疑您是否能够仅使用 windows scheduler 进行高级调度。

我要做的是用某种高级语言(C#、JAVA 等)编写调度逻辑(例如,当您希望批处理文件运行时),然后在批处理文件的开头调用该程序以查看它是否是你关心的日期。

可以使用 Windows 调度程序将批处理文件设置为每天运行(如果需要,每天运行多次),但只有当您的 C#/JAVA 程序表明这是您关心的日期时,它才会执行“真正的工作” .

于 2012-06-13T17:05:45.413 回答
0

公共静态 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);
                    

    }
于 2021-10-26T08:14:33.710 回答