【问题标题】:Compare current time to file date time last modified in Windows Batch File将当前时间与 Windows 批处理文件中上次修改的文件日期时间进行比较
【发布时间】:2020-02-18 11:54:31
【问题描述】:

我希望批处理文件中的命令仅在过去 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

【问题讨论】:

  • 这是我之前为此目的编写的脚本。通过一些修改,可以将分钟包括在比较中。微小的调整将允许程序在您的日志文件上运行而无需输入https://pastebin.com/hNCgcLLa 该脚本演示了可用于在当前时间和文件时间之间创建可比较的日期时间信息的转换和子字符串修改
  • 关于示例脚本中的比较运算符,GTR GEQ EQU LEQ LSSIf "%Var%"=="value"If Not "%Var%"=="value" 有效,<> 无效 - 在批处理中它们是重定向字符。

标签: datetime batch-file last-modified


【解决方案1】:

另一个使用来自您的 的实现:

@Echo Off
Set "filename=last_run.txt"
Set "minutes=15"
If Not Exist "%filename%" GoTo :PrintList
"%__APPDIR__%WindowsPowerShell\v1.0\powershell.exe" -NoProfile If(((Get-Date)-(Get-Item ".\%filename%").LastWriteTime).Minutes -LT %minutes%){Exit 1}
If ErrorLevel 1 Exit /B
Rem Your payload below here.

:PrintList
CD.>"%filename%"

如果您乐于接受运行此代码的 PC 将始终在 %PATH%%PATHEXT% 中具有适当的条目,您可以将 "%__APPDIR__%WindowsPowerShell\v1.0\powershell.exe" 更改为仅 PowerShell

【讨论】:

    【解决方案2】:

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

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

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

    @echo off
    setlocal 
    set "filename=last_run.txt"
    set "minutes=15"
    if not exist "%filename%" (
       break>"%filename%"
       goto :PrintList
    )
    for /f %%a in ('"powershell Test-Path %filename% -OlderThan (Get-Date).AddMinutes(-%minutes%)"') do set "older=%%a"
    if "%older%" == "True" (
      echo %filename% is older than %minutes% minutes; print list
      break>"%filename%"
      goto :PrintList
    ) else (
      echo %filename% is younger than %minutes% minutes; exiting
      goto :eof
    )
    :PrintList
    echo insert your payload here.
    

    【讨论】:

    • 鉴于更简单的解决方案和将信息批量处理成有用形式所涉及的工作更少...是时候开始学习更多的 powershell
    【解决方案3】:

    您可以使用 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% 等于或大于来自%earlier%15,则该命令将运行。此外,如果该文件尚不存在,它将创建它并首次运行该命令。从那里它只会​​在文件中的秒数小于或等于当前分钟数的情况下运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2011-11-14
      相关资源
      最近更新 更多