Date 获取当前日期和上一日期之间的差异
如果我在cmd中输入Date 获取当前日期和上一日期之间的差异,date,batch-file,cmd,Date,Batch File,Cmd,如果我在cmd中输入echo%date%,我将得到今天的日期。假设今天是2018年11月21日星期三。如果我键入echo%date%cmd将打印2018年11月21日星期三。昨天,它将于2018年11月20日星期二返回。这两个日期之间的差异(以天为单位)为1 有没有办法在命令提示符下执行这种减法?比如: set previous_date=Tue 11/20/2018 echo %date% - %previous_date% 我知道这在像python或VBScript这样的编程语言中应该很容
echo%date%
,我将得到今天的日期。假设今天是2018年11月21日星期三。如果我键入echo%date%
cmd将打印2018年11月21日星期三
。昨天,它将于2018年11月20日星期二返回。这两个日期之间的差异(以天为单位)为1
有没有办法在命令提示符下执行这种减法?比如:
set previous_date=Tue 11/20/2018
echo %date% - %previous_date%
我知道这在像python
或VBScript
这样的编程语言中应该很容易做到,但我不想使用任何一种,除非这是绝对必要的。我可以下载并使用自定义命令行工具,但我想用批处理文件来实现这一点
任何知道怎么做的人?(我之前在评论中发布过这一点,因为问题被锁定。由于它现在被解锁,我将此作为答案提交)
批处理脚本语言没有任何内置的计算时间差的方法。这个问题可以通过各种方式解决,例如:
- 使用其他脚本语言编写,如VBS、AutoIt、PowerShell等
- 从(,)下载现有的外部程序,如unix
实用程序。使用date
将for
的输出获取到变量中,然后使用日期“+%s”
计算差值设置/a
- 分析内置
命令或date
变量的输出。其他地方(,)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间/日期表示的影响,如果需要精度,也很难正确考虑闰年%date%
%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>您的文件名
这也巧妙地解决了在某处存储日期信息的问题
现在,要测试自上次运行作业以来是否至少已经过了7天,您需要检查文件是否至少有7天。最简单的方法是使用robocopy
实用程序-其/minage:NNN
参数仅在文件至少存在NNN天时复制文件
因此,我们定期尝试复制该文件,看看是否成功。我们通过检查复制的文件(c:\some\test.txt
)是否像这样存在:如果存在您的文件名转到您的\u标签
最后,如果文件已被复制,则不再需要该文件,我们需要使用del/y删除您的\u文件名
<代码>/y
仅为以防万一而覆盖确认,通常可以省略
如果由于任何原因删除了标记文件,示例中的第一行将确保立即启动作业(我假设是某种备份或类似的操作)。如果文件不存在,则永远不会复制该文件,因为原始文件首先不存在,因此在这种情况下作业永远不会运行
怪癖:
如果某些程序出于某种原因更新“标记”文件的修改日期,则作业将被延迟。如果这是不需要的,您应该将此文件放在够不着的地方,例如%AppData%\Roaming\YOUR\u SCRIPT\u NAME
文件夹。如果从备份中还原文件,也可能发生同样的情况
为了解决这样一个问题,你可以考虑将标记文件压缩成一个存档文件,如<代码> zip ,但这也需要外部程序、VBS或POWER S壳。可能会以某种方式滥用内置的Windows备份实用程序(
sdclt
),但我没有找到解决方法。(我以前在评论中发布过此问题,因为问题已锁定。由于问题已解锁,我将此作为答案提交)
批处理脚本语言没有任何内置的计算时间差的方法。这个问题可以通过各种方式解决,例如:
- 使用其他脚本语言编写,如VBS、AutoIt、PowerShell等
- 从(,)下载现有的外部程序,如unix
date
实用程序。使用for
将日期“+%s”
的输出获取到变量中,然后使用设置/a
计算差值
- 分析内置
date
命令或%date%
变量的输出。其他地方(,)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间/日期表示的影响,如果需要精度,也很难正确考虑闰年
我想分享另一个技巧:使用文件创建日期差异。这仍然有点像黑客,但可以说比手工解析%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>您的文件名
这也巧妙地解决了在某处存储日期信息的问题
现在,要测试自上次运行作业以来是否至少已经过了7天,您需要检查文件是否至少有7天。最简单的方法是使用robocopy
实用程序-其/minage:NNN
参数仅在文件至少存在NNN天时复制文件
因此,我们定期尝试复制该文件,看看是否成功。我们通过检查copi