如何遍历批处理文件中的日期范围

时间:2014-12-30 22:06:30

标签: loops variables batch-file scripting

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

我怎么试图进一步自动化。

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

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

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

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

提前干杯

卢克..

3 个答案:

答案 0 :(得分:5)

处理日期的最佳方法不是重新发明轮子。批处理/ 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

答案 1 :(得分: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
如果不是二月,那我们就不在了 否则,如果新的日期数是30,则添加2制作32并且它是eom
否则,如果年份数可以被4整除,则不是eom 否则,新的一天数必须是29,所以加上3,制作32,这是eom

在eom中,将69添加到新的日期值69,这将增加月份并设置day = 1 如果结果月份数为13,则添加8800以增加年份并使月份= 01。

答案 2 :(得分:0)

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