在一台windows机器(win7或win-server2008R2)上,我有一个批处理脚本,可以将一些.config文件复制到备份文件夹中
我想写另一个脚本,删除一周前创建的备份文件。
关于如何使用FORFILES
(例如),有很多建议:
FORFILES /P "D:Configs_Backup" /M *.config /D -7 /C "cmd /c del @file"
但是这个命令使用"修改的"时间戳,而我需要使用创建日期。
在不安装任何第三方程序的情况下,是否可以通过命令控制台实现这一点?
试试这个,看看输出并删除echo
,如果它看起来不错:
@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET /a XDay=7
CALL :DateToJDN "%DATE%" JDNToday
FOR /r "D:Configs_Backup" %%a IN (*.config) DO (
FOR /f "tokens=1,4*" %%b IN ('dir /tc "%%~a"^|findstr "^[0-9]"') DO (
CALL :DateToJDN "%%b" filedate
SET /a diffdays=JDNToday-filedate
IF !diffdays! gtr %XDay% ECHO DEL /F /Q "%%~a"
)
)
GOTO :eof
:DateToJDN "DD mm/dd/yyyy" jdn=
setlocal
set date=%~1
set /A yy=%date:~-4%, mm=1%date:~-10,2% %% 100, dd=1%date:~-7,2% %% 100
set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075
endlocal & set %2=%jdn%
exit /B
注意:这仅适用于AM/PM
时间格式。
看看这是否有帮助-保留最近创建日期的5*.config文件(skip=5)
在样本文件上测试它。
@echo off
pushd "d:folder"
del file2.tmp 2>nul
for /f "delims=" %%a in ('dir *.config /b /a-d ') do call :getcreationdate "%%~fa"
sort /r <file2.tmp >file.tmp
for /f "skip=5 tokens=1,*" %%a in (file.tmp) do del "%%~b"
del file.tmp file2.tmp
popd
pause
goto :EOF
:getcreationdate
set "file=%~1"
set "file=%file:=\%"
WMIC DATAFILE WHERE name="%file%" get creationdate | find "." >file.tmp
for /f %%b in (file.tmp) do set dt=%%b
set dt=%dt:~0,8%_%dt:~8,6%
del file.tmp
>>file2.tmp echo %dt% "%~1"
我知道这是一篇旧帖子,但我偶然发现了它,它起到了帮助作用。我最终选择了@Gray作为评论暗示的路线,并将我的.bat复制脚本更改为这个,这样它在复制时会更新修改后的日期,而不是试图在清理脚本中解决它。
copy %1 %2 /y
copy /b %2+,, %2
https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch