获取N天的日期

时间:2017-07-07 14:35:44

标签: batch-file cmd batch-processing

我发现我的bat脚本存在一些问题,该脚本专用于以YYYYMMDD格式查找日期,但仍无法找出此类行为的原因。

脚本代码:

@ECHO OFF
SetLocal EnableDelayedExpansion
SetLocal

SET CmdFile="C:\cmd.ini"
SET StartDate = ""

call:getDate %1 StartDate

IF EXIST %CmdFile% del %CmdFile%

(
    echo RangeBegin=20%StartDate%
) > %CmdFile%

:getDate
set day=%~1
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
set "YYYY=%result:~0,4%"
set "MM=%result:~4,2%"
set "DD=%result:~6,2%"
set "data=%YYYY:~2,4%%mm%%dd%"
set "%~2=%data%"
goto:eof

endlocal

因此,我调用了像makecmd.bat -10这样的脚本,并期望在名为C:\的{​​{1}}驱动器中找到一个新文件,其中包含以下内容:

cmd.ini

但得到了这个:

RangeBegin=20170627

我做错了什么?

1 个答案:

答案 0 :(得分:1)

代码中还有一些错误:

SET StartDate = ""
  • ""(前导空格)分配给名为StartDate的变量 带有尾随空格
  • IF EXIST %CmdFile% del %CmdFile%如下所示是多余的 不过,echo会覆盖文件。
  • 由于程序流程将到达标签:getDate,因此应该有一个 goto :eof或之前放置的Exit /b
  • 在vbscript中没有使用变量d,为什么定义它?
  • vbscript已经以yyyyMMdd格式创建了一个日期 拆分,然后错误地放在剩余的批次部分?
  • 永远无法联系到最后一行endlocal

虽然我怀疑批处理是否应该对驱动器c的根目录具有写入权限:这个批处理版本应该这样做:

@ECHO OFF
SetLocal EnableDelayedExpansion

SET CmdFile="C:\cmd.ini"
SET "StartDate="
call:getDate %1 StartDate

 > %CmdFile% echo RangeBegin=%StartDate%

Goto :Eof
:getDate
set day=%~1
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "%~2=%%a"

样品输出:

> SO_44973476.cmd -10
> type cmd.ini
RangeBegin=20170627

如果您不介意批量使用PowerShell,这将得到完全相同的结果:

@ECHO OFF
for /f %%a in (
  'powershell -NonI -NoP -C "(get-date).AddDays(%~1).ToString(\"yyyyMMdd\")"'
) Do >"C:\cmd.ini" Echo RangeBegin=%%a