日期频率的批处理脚本

时间:2018-01-29 08:46:08

标签: windows date batch-file cmd scripting

我需要你的cmd脚本帮助。

让我简要解释一下我的问题。

现在在我的公司,我们有一个Windows批处理文件(.bat),每天通过调度程序运行。

此批处理文件运行SAS程序,该程序根据今天的日期触发两个程序:

  • 如果今天=月的第二个星期一,则执行程序1.

  • 如果今天=月的第3个星期一,则执行程序2.

因此,每天运行的SAS程序会根据日期执行这两个程序。 SAS具有非常酷且易于使用的功能(INTNX)来操作日期,这对于不熟悉编码的人来说确实很有帮助。 现在为了防止这个SAS程序每天运行,我想看看是否有办法在批处理脚本中执行这个条件语句来触发基于它的两个程序。

我是批处理脚本的新手,所以在网上进行习惯性研究后,我能够在很基本的层面上理解一些语法。 这就是我想在.bat文件中使用的内容:

FOR /F "TOKENS=1* DELIMS= " %A IN ('DATE/T') DO SET Today=%B

::Do something to SET Monday2=2nd Monday of current month and Monday3=3rd Monday of current month

IF %Today%==%Monday2% ("D:\Project\Monday2.exe")

IF %Today%==%Monday3% ("D:\Project\Monday3.exe")
你能帮帮我吗?

不一定必须采用上述格式。如果有更好,更有效的方法来解决,我很乐意使用它。

谢谢!

3 个答案:

答案 0 :(得分:0)

for /f "tokens=1,2 delims=. " %%a in ('date /T') do (
        if /I "%%a"=="mo" (
                    if %%b GTR 7 if %%b LEQ 14 set "mo=2dn"
                    ) else (
                    if %%b GTR 14 if %%b LEQ 21 set "mo=3rd"
                    )
        )

UNTESTED - 唯一的想法(因为这个星期一是第4 ......)

答案 1 :(得分:0)

wmicfor循环结合使用以获取所需数据:

@echo off
for /f  %%a in ('WMIC Path Win32_LocalTime Get WeekInMonth^,DayOfWeek /value ^|find "="') do set /a "%%a"
if %DayOfWeek% neq 1 goto :eof
if %WeekInMonth% == 2 "D:\Project\Monday2.exe"
if %WeekInMonth% == 3 "D:\Project\Monday3.exe"

首先if是检查,如果它是星期一并退出,如果不是。当您将任务安排在仅在星期一运行时,可以省略此行。

答案 2 :(得分:0)

在Powershell中写这个可能更清晰,更可维护。

=== domonday.bat

powershell -NoProfile -File "./domonday.ps1"

=== domonday.ps1

[CmdletBinding()]
Param()

$date = Get-Date
Write-Verbose $date.DayOfWeek

if ([Int]($date).DayOfWeek -eq 1) {
    Write-Verbose "day is Monday 1"
    Write-Verbose [String]$date.Day
    if ($date.Day -ge 8 -and $date.Day -le 14) {
        Write-Verbose "Doing second Monday"
        & "D:\Project\Monday2.exe"
    }
    if ($date.Day -ge 15 -and $date.Day -le 21) {
        Write-Verbose "Doing third Monday"
        & "D:\Project\Monday3.exe"
    }
}

如果你想要它没有所有Write-Verbose行:

$date = Get-Date
if ([Int]($date).DayOfWeek -eq 1) {
    if ($date.Day -ge 8 -and $date.Day -le 14) { & "D:\Project\Monday2.exe" }
    if ($date.Day -ge 15 -and $date.Day -le 21) { & "D:\Project\Monday3.exe" }
}