【问题标题】:How to loop through a date range in a batch file如何遍历批处理文件中的日期范围
【发布时间】:2014-12-30 22:06:29
【问题描述】:

我通过批处理文件运行报告,此时我有一个消息框提示,允许我输入我想要运行报告的日期,这工作正常并将变量设置为输入的日期。

我是如何尝试进一步自动化的。

例如,我想从 060114 到 120114 (MMDDYY) 运行此报告 我想使用循环功能,以便通过批处理运行的脚本将运行范围内的每个日期,一旦到达结束日期,将转到批处理文件的下一部分。

例如第一部分使用输入的日期并分配给变量 %b

我已经为日期范围设置了两个提示,起始日期将分配给变量 %c 结束日期将分配给 %d。

正确分配给变量的日期,使用循环函数的最佳方法是什么

提前干杯

卢克..

【问题讨论】:

  • 如果可以使用YYMMDD格式就很简单了。

标签: loops variables batch-file scripting


【解决方案1】:

处理日期的最佳方法不是重新发明轮子。 Batch/CMD 没有日期的概念,因此要遍历日历日期需要自己实现(包括月份长度、闰年检查等)。

对于这个任务,我建议使用脚本语言,比如 PowerShell。此脚本daterange.ps1 生成指定的两个日期之间的日期列表(包括日期)。

param(
  [String]
  $DateStart,

  [String]
  $DateFinish
)


Function ParseDateStr {
  param(
    [String]
    $s
  )
  return Get-Date `
           -Month $s.substring(0,2) `
           -Day $s.substring(2,2) `
           -Year ('20'+$s.substring(4,2)) `
           -Hour 0 -Minute 0 -Second 0
}

$start = ( ParseDateStr $DateStart )
$finish = ( ParseDateStr $DateFinish )

$delta = New-TimeSpan -Days 1

for ($d = $start; $d -le $finish; $d +=$delta) {
    Write-Host $d.toString("MMddyy")
}

它可以在批处理文件中使用,例如:

@ECHO OFF
SETLOCAL

SET /P STARTDATE=Starting date: 
SET /P ENDDATE=Ending date: 

FOR /F %%d IN ('powershell -NoProfile -ExecutionPolicy Bypass -File daterange.ps1 %STARTDATE% %ENDDATE%') DO (
    @ECHO %%d
)

循环变量%d 将为范围内的每一天提供一个格式正确的日期。

例如:

C:\temp>sol
Starting date: 022716
Ending date: 030116
022716
022816
022916
030116

【讨论】:

    【解决方案2】:
    @ECHO OFF
    SETLOCAL
    :: Get dates
    SET /p "startdate=Start date "
    SET /p "enddate=End date "
    CALL :universal startdateu %startdate%
    CALL :universal enddateu %enddate%
    :Loop
    CALL :nextdate
    ECHO Use DATE %selected%
    IF "%enddateu%" geq "%startdateu%" GOTO Loop
    
    GOTO :EOF
    
    :nextdate
    :: Rebuild "startdateu" in selected format-to-use (MMDDYY programmed)
    SET "selected=%startdateu:~2,2%%startdateu:~4,2%%startdateu:~0,2%"
    :: bump startdateu
    SET /a startdateu=1%startdateu% + 1
    IF 1%startdateu:~-2% leq 128 GOTO noteom
    IF "%startdateu:~-2%"=="32" GOTO eom
    :: short months
    IF "%startdateu:~-2%"=="31" FOR %%a IN (04 06 09 11) DO IF "%%a"=="%startdateu:~3,2%" SET /a startdateu+=1&GOTO eom
    :: not-Feb
    IF "%startdateu:~3,2%" neq "02" GOTO noteom
    IF "%startdateu:~-2%"=="30" SET /a startdateu+=2&GOTO eom
    :: Only allow Feb 29 if leap year
    SET /a startdate=%startdateu:~0,3% %% 4
    IF %startdate%==0 GOTO noteom
    SET /a startdateu+=3
    :eom
    SET /a startdateu+=69
    IF "%startdateu:~3,2%" equ "13" SET /a startdateu+=8800
    :noteom
    SET "startdateu=%startdateu:~1%"
    GOTO :eof
    
    :: Convert to universal (YYMMDD) format - details depend on desired convention (MMDDYY programmed)
    :universal
    SET %1=%~2
    CALL SET "%1=%%%1:~4,2%%%%%1:~0,2%%%%%1:~2,2%%"
    GOTO :eof
    

    这是一种生成此类日期列表的方法 - 您显然没有指定要为您的报告例程提供什么格式,所以我将把修改留给您。

    本质上,每个输入的日期都被转换为 yymmdd 格式;选定的日期被转换回准备显示,startdateu 中的通用格式日期递增。为了让数学能力与前 0 年一起使用,1 在前一个日期之前串起来,在增量之后被剥离。

    如果新的天数是 28 或更少,那么它不是 eom
    如果新的 daynumber 变成 32,那么它就是 eom
    如果新的天数变成 31,那么在短短的几个月里,再加上一个 1,变成 32,它就是 eom
    如果不是二月,我们不在 eom
    否则,如果新的 daynumber 为 30,则加 2 为 32,即为 eom
    否则,如果 yearnumber 可以被 4 整除,则不是 eom 否则新的天数必须是 29 所以加 3 就是 32 就是 eom

    在 eom 处,将 69 添加到新的天数 69,这将增加月份并设置 day=1。
    如果生成的月份数为 13,则添加 8800 以增加年份并使月份 =01。

    【讨论】:

      【解决方案3】:

      我认为for %a in (120114,120214,120314) do batchfilename.cmd 会起作用。此外,您可以使用 Excel(或电子表格程序)快速组合日期范围。然后(例如在 Excel 中)您可以将日期范围连接到命令 A 列具有日期范围,B 列具有命令,然后在 C 列 =CONCATENATE(B1," ",A1) 注意两个双引号表示用空格分隔项目。您可以使用任何字符并运行另一个 for 循环,并将 delim 设置为该字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-30
        • 2016-11-03
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多