获取当前日期和上一个日期之间的差额

时间:2018-11-21 13:33:55

标签: date batch-file cmd

如果我在cmd中输入echo %date%,则会得到今天的日期。我们说今天是Wednesday, 21/11/2018。如果输入echo %date%,则cmd将打印Wed 11/21/2018。昨天,它将返回Tue 11/20/2018。这两个日期(以天为单位)之差为1

有什么方法可以在命令提示符下进行这种减法吗?像这样:

set previous_date=Tue 11/20/2018
echo %date% - %previous_date%

我知道使用pythonVBScript之类的编程语言来进行此操作应该非常容易,但是除非绝对必要,否则我不想使用其中的任何一种。我可以下载和使用自定义命令行工具,但是我想使用批处理文件来完成此操作。

谁知道怎么做?

2 个答案:

答案 0 :(得分:3)

在您的评论之一中,您说:

  

我的Startup文件夹中有一个bat文件,该文件一次运行一次   周。它通过检查当天并运行流程来完成此操作   如果是星期一,则日期为%date:〜0,1%== M()。问题是我需要这个过程   每7天至少发布一次。但是如果说我忘记打开我的   特定星期一的笔记本电脑,直到启动该过程   下周一。所以现在我只想更改启动逻辑   如果至少有7天没有启动该过程,则为该过程

这就是TaskScheduler所要处理的。无需弄乱日期计算甚至是%date%的语言依赖格式。

启动TaskScheduler
“创建任务”(请勿“创建基本任务”)
在“触发器”设置为“每周”中,“每1周进行一次修复:Monday
在“设置”中,选中“错过计划的启动后尽快运行任务”
还要根据需要填写“常规”,“操作”和“条件”标签。

答案 1 :(得分:1)

(由于问题已被锁定,我之前已在评论中发布了此内容。由于该问题现已被解锁,因此我将其作为答案提交)

批处理脚本语言没有任何内置的方法来计算时间差。此问题可以通过多种方式解决,例如:

  • 使用其他脚本语言(例如VBS,AutoIt,PowerShell等)将其写入。
  • gnuwin32 coreutilsmanualrecipe)下载现有的外部程序,例如unix date实用程序。使用fordate "+%%s"的输出转换为变量,然后使用set /a计算差值。
  • 解析内置date命令或%date%变量的输出。在其他地方(ABCDE)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间的影响。 / date表示形式,并且如果需要精度,也很难正确考虑leap年。

我想分享另一个技巧:使用文件创建日期差。仍然有点骇人听闻,但可以说比手动解析%date%更可移植。

这是一个示例,说明如下:

if not exist "c:\some\marker.txt" goto RunTheJob
robocopy /minage:7 "c:\some\marker.txt" "c:\some\test.txt"
if exist "c:\some\test.txt" goto RunTheJob
goto SkipTheJob

:RunTheJob
del /y "c:\some\test.txt"
echo 1 >"c:\some\marker.txt"
rem ... THIS RUNS ONCE IN 7 DAYS ...

:SkipTheJob

每当我们运行作业(即7天一次)时,我们也会创建(或更新)“标记”文件(示例中为c:\some\marker.txt)。该文件的内容和位置无关紧要,只有其修改日期有效,因此我只需要使用1

向其中写入字符echo 1 >YOUR_FILENAME

这也很好地解决了将日期信息存储在某个地方的问题。

现在要测试自作业上次运行以来是否已过去至少7天,您需要检查文件是否已存在至少7天。最简单的方法是使用robocopy实用程序-其/minage:NNN参数仅在文件至少存在NNN天时才复制文件。

因此,我们定期尝试复制文件,然后查看是否成功。为此,我们检查复制的文件(c:\some\test.txt)是否像这样:if exist YOUR_FILENAME goto YOUR_LABEL

最后,如果复制了文件,则不再需要它,我们需要使用del /y YOUR_FILENAME将其删除。 /y会覆盖确认,以防万一,通常可以省略。

如果由于某种原因删除了标记文件,则示例中的第一行可确保立即启动作业(我假设是某种备份或类似的备份)。如果不存在该文件,则该文件将永远不会被复制,因为原始文件根本就不存在,因此该作业永远不会在这种情况下运行。

怪癖:

如果某些程序由于某种原因更新了“标记”文件的修改日期,则作业将被延迟。如果不希望这样,则应将此文件放在遥不可及的地方,例如%AppData%\Roaming\YOUR_SCRIPT_NAME文件夹。如果从备份还原文件,可能会发生同样的事情。

要解决此问题,您可以考虑将标记文件压缩到诸如zip之类的存档中,但这也需要外部程序,VBS或PowerShell。可能会以某种方式滥用内置的Windows备份实用程序(sdclt),但我没有找到解决方法。