如果我在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%
我知道使用python
或VBScript
之类的编程语言来进行此操作应该非常容易,但是除非绝对必要,否则我不想使用其中的任何一种。我可以下载和使用自定义命令行工具,但是我想使用批处理文件来完成此操作。
谁知道怎么做?
答案 0 :(得分:3)
在您的评论之一中,您说:
我的Startup文件夹中有一个bat文件,该文件一次运行一次 周。它通过检查当天并运行流程来完成此操作 如果是星期一,则日期为%date:〜0,1%== M()。问题是我需要这个过程 每7天至少发布一次。但是如果说我忘记打开我的 特定星期一的笔记本电脑,直到启动该过程 下周一。所以现在我只想更改启动逻辑 如果至少有7天没有启动该过程,则为该过程
这就是TaskScheduler所要处理的。无需弄乱日期计算甚至是%date%
的语言依赖格式。
启动TaskScheduler
“创建任务”(请勿“创建基本任务”)
在“触发器”设置为“每周”中,“每1
周进行一次修复:Monday
在“设置”中,选中“错过计划的启动后尽快运行任务”
还要根据需要填写“常规”,“操作”和“条件”标签。
答案 1 :(得分:1)
(由于问题已被锁定,我之前已在评论中发布了此内容。由于该问题现已被解锁,因此我将其作为答案提交)
批处理脚本语言没有任何内置的方法来计算时间差。此问题可以通过多种方式解决,例如:
date
实用程序。使用for
将date "+%%s"
的输出转换为变量,然后使用set /a
计算差值。date
命令或%date%
变量的输出。在其他地方(A,B,C,D,E)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间的影响。 / 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
),但我没有找到解决方法。