[英]Compare current time to file date time last modified in Windows Batch File
我希望批處理文件中的命令僅在過去 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)的幫助:
@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.
您可以使用 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
,則命令將運行。 此外,如果該文件尚不存在,它將創建它並第一次運行該命令。 從那里它只會在文件中的秒數為 15 或小於當前分鍾時運行。
使用批處理文件中的powershell 的另一種實現:
@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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.