Пакетный файл для удаления файлов старше указанной даты
Как мне создать командный файл для удаления файлов старше указанной даты?
Это не похоже на работу;
:: --------DELOLD.BAT----------
@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i
type %1
pause
set mm=%thedate:~0,2%
set dd=%thedate:~3,2%
set yyyy=%thedate:~6,4%
set /A dd=%dd% - %OLDERTHAN%
set /A mm=%mm% + 0
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31
goto ERROR
:SET31
set /A dd=31 + %dd%
goto DONE
:SET30
set /A dd=30 + %dd%
goto DONE
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
:SET28
set /A dd=28 + %dd%
goto DONE
:SET29
set /A dd=29 + %dd%
:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
for %%i in (*.*) do (
set FileName=%%i
call :PROCESSFILE %%~ti
)
set mm=
set yyyy=
set dd=
set thedate=
goto EXIT
:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD X
ECHO Where X is the number of days previous to Today.
ECHO.
ECHO EX: "DELOLD 5" Deletes files older than 5 days.
GOTO EXIT
:PROCESSFILE
set temp=%1
set fyyyy=20%temp:~6%
set fmm=%temp:~0,2%
set fdd=%temp:~3,2%
if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6%
:: ***************************************
:: * This is where the files are deleted *
:: * Change the ECHO command to DEL to *
:: * delete. ECHO is used for test. *
:: ***************************************
if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
ECHO %FileName%
)
set temp=
set fyyyy=
set fmm=
set fdd=
:EXIT
:: ----------END-DELOLD.BAT-------------
Ответы
Ответ 1
Я использую этот script:
////////////////////////////////////////////////////////
// Deletes file older than a number of days
// in the current directory
////////////////////////////////////////////////////////
// Usage: wscript DeleteOlderThan.js [#Days]
// By default, remove files older than 30 days
////////////////////////////////////////////////////////
function removeDays(date, nDays)
{
var dateRet = date
return dateRet.setDate(date.getDate() - nDays);
}
function addSlash(strPath)
{
var c = strPath.substr(-1, 1);
if( c !== '\\' && c !== '/' )
{
strPath += '\\';
}
return strPath;
}
// Read arguments
var nDays = WScript.Arguments(0) || 30;
// Create system objects
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");
// Retrieve current directory
var strDirectoryPath = addSlash(shell.CurrentDirectory);
// Compute date
var dateNow = new Date();
var dateTest = removeDays(dateNow, nDays);
// Iterate on files
var folder = fs.GetFolder(strDirectoryPath);
var files = folder.Files;
for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
{
var file = it.item();
if( file.DateLastModified < dateTest)
{
file.Delete(true);
}
}
который я вызываю каждый день с помощью:
wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30
Ответ 2
Если вы находитесь на Windows Server и/или имеете установленный набор ресурсов сервера, файлы forfiles могут быть именно тем, что вы ищете.
Примеры:
распечатать все имена файлов, старше 180 дней
forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt
удалить все файлы PDF, старше 365 дней
forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path"
Ответ 3
Изменить: Я понял это.
Чтобы удалить все файлы старше установленной даты:
REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"
Чтобы удалить все файлы, более поздние, чем заданная дата:
REM del_new.bat
REM usage: del_new MM-DD-YYYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa"
Ответ 4
eJames: Я нашел, что ваше решение xcopy работает очень хорошо, действительно! Мне нравится больше всего в том, что он должен работать и в версиях Windows, отличных от английского, так как формат параметров XCOPY, по-видимому, зависит от даты. Замечательно!;]
Одним из улучшений было бы предварительное создание файла FILES_TO_KEEP.TXT, чтобы, если ни один из файлов не соответствует критериям сохранения, второй оператор XCOPY может продолжать работу и выполнять удаление (он терпит неудачу, если он не может найти файл FILES_TO_KEEP.TXT). Здесь мой script (обратите внимание, что в этом примере я изменил его, чтобы удалить только файлы *.pdf, а также изменил имя файла temp, чтобы убедиться, что нет потенциальных конфликтов, а также после очистки временного файла):
@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX
echo >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa"
del ~~~FILES_TO_KEEP.TXT~
GOTO END
:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD mm-dd-yyyy
ECHO Where mm-dd-yyyy is the date prior to which you want to delete files.
ECHO.
ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008.
ECHO.
ECHO This should work on any language version of Windows, but has only been
ECHO tested in English-US versions.
GOTO END
:END
Ответ 5
Мое решение работает, если вы
- либо у вас есть утилита
touch
в вашей системе (что я делаю)
- или может позволить себе временно изменить системную дату с помощью команды
date
(что, вероятно, не так, но кто знает)
Вот идея:
-
В целевом каталоге создайте файл сигнала (с уникальным именем) и отметьте отметку времени, равную вашему пороговому значению удаления. Это можно сделать с помощью touch
(который принимает желаемую временную метку в качестве параметра) или путем запоминания текущей даты с помощью date /T
, изменения системной даты на желаемую с помощью date <param>
и восстановления исходной даты.
-
Используйте for /f %%I in ('dir /od')
для перебора всех файлов, упорядоченных по дате, удаляя их по одному. После того, как вы встретите (и удалите) файл сигнала, прекратите удаление.
Ответ 6
Возможно, вам бы хотелось:
http://blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/
Thats script, который будет перемещать файлы старше одного года, даже поддерживает различные форматы дат и вложенные папки.
Вы можете внести несколько изменений, чтобы удалить их, а не перемещать их. Его очень полный script с комментариями и пояснениями.
Ответ 7
Интересно, почему вам нужно использовать оболочку ole DOS... Python или Windows Powershell будет правильным выбором в 2008 году:)
Ответ 8
Я не знаю, можете ли вы сделать это с .BAT файлами и с некоторыми инструментами Windows, но вы можете с файлами .js(JScript) или .vbs(VBScript). Вы делаете это под Windows, правильно? Если это так, то Windows может обрабатывать файлы .js и .vbs так же, как и файлы .bat по умолчанию. Они намного мощнее.
И если вы планируете использовать только Windows Server 2008, там PowerShell, который еще лучше (можно загрузить для других версий Windows).