我发现我的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
我做错了什么?
答案 0 :(得分:1)
代码中还有一些错误:
SET StartDate = ""
""
(前导空格)分配给名为StartDate
的变量
带有尾随空格IF EXIST %CmdFile% del %CmdFile%
如下所示是多余的
不过,echo会覆盖文件。:getDate
,因此应该有一个
goto :eof
或之前放置的Exit /b
。d
,为什么定义它?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