Пакетный файл для удаления файлов старше указанной даты
Как мне создать командный файл для удаления файлов старше указанной даты?
Это не похоже на работу;
:: --------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-------------
8 ответов
Я использую этот скрипт:
////////////////////////////////////////////////////////
// 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
Если вы используете Windows Server и / или у вас установлен Server Resource Kit, 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"
Редактировать: я понял это.
Чтобы удалить все файлы старше указанной даты:
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"
eJames: Я нашел, что ваше решение xcopy работает очень хорошо! Что мне больше всего нравится в этом, так это то, что он должен работать и в языковых версиях Windows, отличных от английского, поскольку формат параметров XCOPY кажется независимым от установки даты. Замечательно!;]
Одним из улучшений было бы предварительное создание файла FILES_TO_KEEP.TXT, чтобы, если ни один файл не соответствовал критериям хранения, второй оператор XCOPY все еще мог продолжить выполнение и удалить (он завершится неудачно, если не сможет найти файл FILES_TO_KEEP.TXT). Вот мой сценарий (обратите внимание, что в этом примере я изменил его, чтобы удалить только файлы *.pdf, а также изменил имя временного файла, чтобы исключить возможные конфликты, а также очистил временный файл впоследствии):
@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
Возможно, вы хотели бы это: http://blog.jumlin.com/2010/10/move-files-in-folders-and-subfolders-older-than-one-year/
Это скрипт, который будет перемещать файлы старше одного года, он даже поддерживает различные форматы даты и подпапки. Вы можете сделать несколько изменений, чтобы удалить их, а не перемещать их. Это очень полный сценарий с комментариями и объяснениями.
Мое решение работает, если вы
- либо есть
touch
утилита в вашей системе (что я делаю) - или можете позволить себе временно изменить системную дату, используя
date
команда (что, вероятно, не так, но кто знает)
Вот идея:
В целевом каталоге создайте файл сигналов (с уникальным именем) и отметкой времени, равной вашему пороговому времени удаления. Это может быть сделано с
touch
(который принимает желаемую метку времени в качестве параметра), или запоминая текущую дату сdate /T
, изменяя системную дату на желаемую сdate <param>
и восстановление первоначальной даты.использование
for /f %%I in ('dir /od')
перебирать все файлы, упорядоченные по дате, удаляя их один за другим. После того, как вы обнаружите (и удалите) файл сигнала, прекратите удаление.
Интересно, почему вы должны использовать оболочку ole DOS... Python или Windows Powershell были бы правильным выбором в 2008 году:)
Я не знаю, сможете ли вы сделать это с файлами.BAT и какими инструментами Windows поставляется, но вы наверняка сможете с файлами.js (JScript) или.vbs (VBScript). Вы делаете это под Windows, верно? Если это так, то Windows может обрабатывать файлы.js и.vbs так же, как и файлы.bat по умолчанию. Они гораздо мощнее.
И, если вам приходится ориентироваться только на Windows Server 2008, есть PowerShell, который еще лучше (доступен для загрузки для других версий Windows).