Datetime 将当前时间与Windows批处理文件中上次修改的文件日期时间进行比较

Datetime 将当前时间与Windows批处理文件中上次修改的文件日期时间进行比较,datetime,batch-file,last-modified,powershell,Datetime,Batch File,Last Modified,Powershell,我希望批处理文件中的命令仅在过去15分钟内未运行时执行。为了实现这一点,我可以创建一个“last_run”文件来记录上次运行的时间 我陷入困境的地方是将上次修改的时间与当前时间进行比较,并在上次修改时间时采取行动 这是我目前的代码: @echo off set filename=last_run.txt if not exist %filename% ( rem NOT EXISTS, CREATE FILE THEN PRINT THE LIST echo.>"%filena

我希望批处理文件中的命令仅在过去15分钟内未运行时执行。为了实现这一点,我可以创建一个“last_run”文件来记录上次运行的时间

我陷入困境的地方是将上次修改的时间与当前时间进行比较,并在上次修改时间时采取行动

这是我目前的代码:

@echo off
set filename=last_run.txt
if not exist %filename% (
   rem NOT EXISTS, CREATE FILE THEN PRINT THE LIST
   echo.>"%filename%"
   GOTO PrintList
) else (
   rem FILE EXISTS, GET TIME LAST MODIFIED
   FOR %%? IN (%filename%) DO (set filetime=%%~t?)
   echo %filetime%
   rem IF TIME LAST MODIFIED > 15 MINS PRINT THE LIST
   if timediff??(%filetime%, current) > 15 mins {
      GOTO PrintList
   } else {
      GOTO End
   }
)

:PrintList
rem PRINT THE LIST
echo now print the list
rem WRITE TO THE FILE TO UPDATE TIME LAST MODIFIED
echo.>"%filename%"
GOTO End

:End

除了缺少时间计算之外,您的代码还有一个。(我下面的解决方案不需要延迟扩展)

cmd
在日期/时间计算方面非常粗糙(可以完成,但是…)

最好使用另一种语言(如PowerShell)的帮助:


使用powerhell命令可以使用总分钟数

@echo off
set error=0
if not exist last_run.txt echo File not yet existed, first run will be now & set /a error+=1
    for /f "delims=," %%i in ('powershell -command "(New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalMinutes"') do set "now=%%i"
    if "%error%" == "1" goto :run
    for /f %%a in (last_run.txt) do set earlier=%%a
    set /a result=%now%-%earlier% 
    if %result% geq 15 (
        :run
           echo RUN COMMANDS HERE
           echo %now%>tmp.tmp
    )

这个概念很简单。我们以分钟计算大纪元时间。将值存储在文件中。然后将当前分钟数与文件中的分钟数进行比较。如果
%now%
等于或大于
%previous%
中的
15
,则将运行该命令。此外,如果该文件尚不存在,它将创建该文件并首次运行该命令。仅当文件中的秒数小于或等于15分钟时,它才会从该文件运行。

另一个实现使用您的:

@Echo关闭
设置“filename=last_run.txt”
设置“分钟=15”
如果不存在“%filename%”转到:打印列表
“%\uuuu APPDIR\uuuu%WindowsPowerShell\v1.0\powershell.exe”-NoProfile If(((获取日期)-(获取项目“\%filename%”)。LastWriteTime)。分钟数-LT%Minutes%){退出1}”
如果错误级别1退出/B
把你的有效载荷移到下面。
:打印列表
CD.>%filename%

如果您愿意接受运行此代码的PC在
%PATH%
%PATHEXT%
中始终具有适当的条目,则可以将
中的“%\uuuuuuuuuu APPDIR\uuuuuuuuuu%WindowsPowerShell\v1.0\powershell.exe”
更改为
powershell

,这是我之前为此编写的脚本。经过一些修改,可以在比较中包括分钟。轻微调整将允许在日志文件上运行程序,而无需输入
https://pastebin.com/hNCgcLLa
该脚本演示了转换和子字符串修改,这些转换和子字符串修改可用于在当前时间和文件时间之间创建可比较的日期-时间信息,这些信息与您计算机中的比较运算符有关示例脚本,
GTR GEQ eq LEQ LSS
如果“%Var%”==“value”
如果“%Var%”==“value”
无效,
和code>
不是批处理,它们是重定向字符。考虑到更简单的解决方案和在批处理中将信息转换为有用形式所涉及的工作量更少。。。是时候开始学习更多的powershell了
@echo off
set error=0
if not exist last_run.txt echo File not yet existed, first run will be now & set /a error+=1
    for /f "delims=," %%i in ('powershell -command "(New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalMinutes"') do set "now=%%i"
    if "%error%" == "1" goto :run
    for /f %%a in (last_run.txt) do set earlier=%%a
    set /a result=%now%-%earlier% 
    if %result% geq 15 (
        :run
           echo RUN COMMANDS HERE
           echo %now%>tmp.tmp
    )