Сравнить текущее время с датой последнего изменения времени в файле Windows Пакетный файл - PullRequest
1 голос
/ 18 февраля 2020

Я бы хотел, чтобы команда в командном файле выполнялась только в том случае, если она не выполнялась в течение последних 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

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Вы можете использовать общее количество минут с помощью команды 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% равно или больше 15 из %earlier%, команда будет запущена. Кроме того, если файл еще не существует, он создаст его и выполнит команду в первый раз. Оттуда он будет работать, только если количество секунд в файле меньше или равно текущим минутам.

1 голос
/ 18 февраля 2020

Другая реализация, использующая из вашего :

@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%"

Если вы рады, что P C работает этот код всегда будет иметь соответствующие записи в %PATH% и %PATHEXT%, вы можете изменить "%__APPDIR__%WindowsPowerShell\v1.0\powershell.exe" на PowerShell.

1 голос
/ 18 февраля 2020

Помимо расчета недостающего времени, в вашем коде проблема с отложенным расширением . (Мое решение, приведенное ниже, не требует отложенного расширения)

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.
...