我通过批处理文件运行报告,目前我有一个消息框提示,允许我输入我想要运行报告的日期,这样可以正常工作并将变量设置为输入日期。 / p>
我怎么试图进一步自动化。
例如,我想将此报告从060114运行到120114(MMDDYY) 我想使用循环函数,以便在批处理中运行的脚本将遍历范围中的每个日期,一旦到达结束日期,将转到批处理文件的下一部分。
例如,第一部分使用输入的日期并分配给变量%b
我为日期范围设置了两个提示,从日期将分配给变量%c 结束日期将分配给%d。
日期正确分配给变量,使用循环函数的最佳方法是什么
提前干杯
卢克..
答案 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设置为该字符。