仅当上次修改时间少于 10 分钟时才复制文件
Copy a file only if last modify is less than 10 minutes
我目前有这个批处理文件,如果 firefox 打开,它会每 10 分钟自动备份一个文件。但我希望 .bat 仅在我的文件 (zotero.sqlite) 的最后修改时间少于 10 分钟时才实际复制:
详情
11:00 AM 我运行 蝙蝠,用我当前的代码,自动创建一个备份。
我离开办公桌 30 分钟(因此在此期间没有对 zotero.sqlite 进行任何修改)。同时,.bat 超时将创建 3 个 zotero.sqlite 副本(在 11:10、11:20 和 11:30)。但我不想要这些副本,因为它们都是相同的(它们的最后修改时间都相同 date/time)。
相反,我希望 .bat 为 "intelligent" 并注意文件是相同的(因为所有文件的最后修改日期都相同)并且仅当最后修改日期不同时才复制文件。
因为我的简单 .bat 不跟踪它上次复制的时间,所以确定 zotero.sqlite 是否被修改的最简单方法是检查上次修改日期并查看是否已经超过 10 分钟了:
● 如果是,则bat 不应复制zotero.sqlite 并重新启动10 分钟超时
● 如果最后修改date/time 小于10分钟前,bat应该复制然后开始10分钟超时
这将防止我累积数百个相同的备份。
@echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
if "%ERRORLEVEL%"=="1" exit /b
timeout /t 600 /nobreak
goto loop
我尝试了 /d 命令,但它给我一个语法错误。
编辑:
这现在适用于常规复制,因此不再提示,使用存档属性检查文件是否已被编辑,然后在复制后删除该属性
@echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%errorlevel%"=="0" goto copy
if "%errorlevel%"=="1" exit /b
:delayloop
timeout /t 600 /nobreak
goto loop
:copy
set "LogFile=C:\Users\Me\Zotero\zotero.sqlite"
attrib "%LogFile%" | findstr /B /L A 1>nul
if "%errorlevel%"=="1" goto delayloop
copy "%LogFile%" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
echo File "%LogFile%" was modified since last check.
attrib -A "%LogFile%"
goto delayloop
我目前有这个批处理文件,如果 firefox 打开,它会每 10 分钟自动备份一个文件。但我希望 .bat 仅在我的文件 (zotero.sqlite) 的最后修改时间少于 10 分钟时才实际复制:
详情
11:00 AM 我运行 蝙蝠,用我当前的代码,自动创建一个备份。 我离开办公桌 30 分钟(因此在此期间没有对 zotero.sqlite 进行任何修改)。同时,.bat 超时将创建 3 个 zotero.sqlite 副本(在 11:10、11:20 和 11:30)。但我不想要这些副本,因为它们都是相同的(它们的最后修改时间都相同 date/time)。 相反,我希望 .bat 为 "intelligent" 并注意文件是相同的(因为所有文件的最后修改日期都相同)并且仅当最后修改日期不同时才复制文件。
因为我的简单 .bat 不跟踪它上次复制的时间,所以确定 zotero.sqlite 是否被修改的最简单方法是检查上次修改日期并查看是否已经超过 10 分钟了:
● 如果是,则bat 不应复制zotero.sqlite 并重新启动10 分钟超时
● 如果最后修改date/time 小于10分钟前,bat应该复制然后开始10分钟超时
这将防止我累积数百个相同的备份。
@echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
if "%ERRORLEVEL%"=="1" exit /b
timeout /t 600 /nobreak
goto loop
我尝试了 /d 命令,但它给我一个语法错误。
编辑:
这现在适用于常规复制,因此不再提示,使用存档属性检查文件是否已被编辑,然后在复制后删除该属性
@echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%errorlevel%"=="0" goto copy
if "%errorlevel%"=="1" exit /b
:delayloop
timeout /t 600 /nobreak
goto loop
:copy
set "LogFile=C:\Users\Me\Zotero\zotero.sqlite"
attrib "%LogFile%" | findstr /B /L A 1>nul
if "%errorlevel%"=="1" goto delayloop
copy "%LogFile%" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
echo File "%LogFile%" was modified since last check.
attrib -A "%LogFile%"
goto delayloop