将当前时间与上次在 Windows 批处理文件中修改的文件日期时间进行比较
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
在 date/time 计算方面非常粗糙(它 可以 完成,但是...)。
最好借助其他语言(如 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 from your batch-file 的实现:
@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
.
我希望批处理文件中的命令仅在过去 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
在 date/time 计算方面非常粗糙(它 可以 完成,但是...)。
最好借助其他语言(如 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 from your batch-file 的实现:
@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
.