批处理文件中的前一天变量

3

我需要编写一个批处理文件,调用一个命令并传递前一天的日期参数。

例如:

[function] CCYYMMDD

我似乎找不到任何这方面的例子。而且我的公司不喜欢我们使用免费软件,所以我真的需要解决方案是基于纯DOS的。


我之前遇到过一些基于批处理的恶心事情,它正是做这个的(如果你想自己搜索一下,它是一个用于在Win32上旋转Apache日志文件的脚本)- 我会看看能否为你找出来。它是哪个Win版本的?我记得我不得不修改它才能让它在2K3上运行。 - DaveRandom
我刚想起来为什么要修改它,这是因为date命令根据系统本地化设置以不同的格式输出日期 - 这是针对一个机器还是可能有不同设置的多个机器? - DaveRandom
也许这是个傻问题,但是... 如果你的公司不希望你使用免费软件,而你们中的一个人自己写了一个批处理脚本,他们有义务在使用之前向公司出售吗? - Andriy M
不,他们会将批处理脚本视为自己的财产,因为它是在我执行日常任务时创建的。他们拥有员工和承包商所创造的所有知识产权。 - Rufus Peoples
2个回答

2
你可以从Dostips: Date and Time开始学习。
有一些函数用于将日期转换为序列日计数,反之亦然。
因此,它的结果如下:
call :jdate "%date%" JD_result
set /a prev_day=JD_result-1
call :jdate2date %prev_day% YYYY MM DD
echo Previous day is %DD%.%MM%.%YYYY%

我收到了以下错误信息:系统找不到指定的批处理标签 - jdate。 - Rufus Peoples
将dostips中的函数复制到您的批处理文件中可能是一个好主意。 - jeb

0

我找不到我之前的解决方案,但我在Rob Van Der Woude的网站上找到了一些很好的东西

该文件中存在一个错误,因为SET /A会将以零开头的字符串视为八进制,这会在日期以零开头时导致问题。

如果您获取上面链接的文件,但更改:JDate过程的代码(第157行):

SET MonthChecker1=%2
SET MonthChecker2=%MonthChecker1:~0,1%
IF %MonthChecker2%==0 (
  SET MonthChecker3=%MonthChecker1:~1,1%
) ELSE (
  SET MonthChecker3=%MonthChecker1%
)
SET DayChecker1=%3
SET DayChecker2=%DayChecker1:~0,1%
IF %DayChecker2%==0 (
  SET DayChecker3=%DayChecker1:~1,1%
) ELSE (
  SET DayChecker3=%DayChecker1%
)
SET /A Month1 = ( %MonthChecker3% - 14 ) / 12
SET /A Year1  = %1 + 4800
SET /A JDate  = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( %MonthChecker3% - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + %DayChecker1% - 32075
FOR %%A IN (Month1 Year1) DO SET %%A=
GOTO:EOF

这个在一个2K8R2系统上测试过并且运行正常。它绝对值得使用,因为它具有从注册表确定主机系统日期格式的能力,而我找到的其他解决方案都没有这种功能。


要解决八进制问题,您也可以使用set /a Month=1%Month% %% 100,它始终在数字前缀处添加1,并使用模运算以安全的方式将它删除。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接