Пакетный файл для удаления файлов старше N дней - PullRequest
634 голосов
/ 09 сентября 2008

Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я искал в Интернете и нашел несколько примеров с сотнями строк кода, и другие, для выполнения которых требовалась установка дополнительных утилит командной строки.

Подобные вещи можно сделать в BASH всего за пару строк кода. Кажется, что-то хотя бы удаленно можно сделать для пакетных файлов в Windows. Я ищу решение, которое работает в стандартной командной строке Windows, без каких-либо дополнительных утилит. Пожалуйста, не PowerShell или Cygwin либо.

Ответы [ 23 ]

1008 голосов
/ 09 сентября 2008

Наслаждайтесь:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Подробнее см. для файловой документации .

Дополнительные сведения см. В Индекс A-Z командной строки Windows XP .

Если на вашем компьютере не установлен forfiles, скопируйте его с любого Windows Server 2003 на компьютер с Windows XP по адресу %WinDir%\system32\. Это возможно, поскольку EXE-файл полностью совместим с Windows Server 2003 и Windows XP.

В более поздних версиях Windows и Windows Server он установлен по умолчанию.

Для Windows 7 и новее (включая windows 10):

Синтаксис немного изменился. Поэтому обновленная команда:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"
74 голосов
/ 27 мая 2011

Выполните следующие команды :

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

Переместите все файлы (используя / mov, который перемещает файлы, а затем удаляет их в отличие от / move, который перемещает целые деревья файлов, которые затем удаляются), через robocopy в другое место, а затем выполните команду удаления по этому пути все хорошо.

Также, если у вас есть каталог с большим количеством данных, вы можете использовать /mir switch

23 голосов
/ 24 августа 2009

Ок, немного соскучился и придумал, что содержит мою версию замены эпохи Linux для бедняков, ограниченную для ежедневного использования (без сохранения времени):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

ИСПОЛЬЗОВАНИЕ

set /a strip=day*7: измените 7 на количество дней, которые нужно сохранить.

set dSource=C:\temp: это начальный каталог для проверки файлов.

ПРИМЕЧАНИЯ

Это неразрушающий код, он покажет, что произошло бы.

Изменение:

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

что-то вроде:

if !epoch! LEQ %slice% del /f %%f

так что файлы на самом деле удаляются

Февраль : жестко запрограммирован на 28 дней. Бессекстильные годы - адское дополнение, действительно. если у кого-то есть идея, которая не добавит 10 строк кода, отправьте сообщение, чтобы я добавил его в свой код.

эпоха : я не принял во внимание время, поскольку необходимо удалить файлы старше определенной даты, так как часы / минуты удалили бы файлы со дня, который предназначался для хранения.

ОГРАНИЧЕНИЕ

эпоха принимает как должное ваш короткий формат даты ГГГГ-ММ-ДД. Его необходимо адаптировать для других настроек или оценки времени выполнения (прочитайте sShortTime, пользовательскую конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).

Я упоминал, что ненавижу автоматическое форматирование этого редактора? он удаляет пустые строки и копирование-вставка является адом.

Надеюсь, это поможет.

19 голосов
/ 08 июня 2011
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Вы должны сделать /d -3 (3 дня назад) Это прекрасно работает для меня. Таким образом, все сложные партии могут быть в мусорном ведре. Также forfiles не поддерживает UNC-пути, поэтому установите сетевое подключение к определенному диску.

17 голосов
/ 24 августа 2009

Посмотрите на мой ответ на похожий вопрос :

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"

Удаляет файлы старше указанной даты. Я уверен, что это может быть изменено, чтобы вернуться на семь дней от текущей даты.

обновление: Я заметил, что HerbCSO улучшил приведенный выше скрипт. Я рекомендую вместо этого использовать его версию .

12 голосов
/ 14 декабря 2010

Моя команда

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - это просто путь в моем случае, поэтому мне пришлось использовать @PATH\@FILE

также forfiles /? у меня тоже не работает, но forfiles (без "?") Работало нормально.

И единственный вопрос, который у меня возникает: как добавить несколько масок (например, " .log | .bak")?

Все это относительно forfiles.exe, которое я скачал здесь (на win XP)

Но если вы используете сервер Windows, forfiles.exe уже должен быть, и он отличается от версии ftp. Вот почему я должен изменить команду.

Для Windows Server 2003 я использую эту команду:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"
8 голосов
/ 28 апреля 2012

Для Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

При этом будут удалены все .sql файлы старше 90 дней.

7 голосов
/ 25 июля 2015

Для Windows 2012 R2 будет работать следующее:

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

для просмотра файлов, которые будут удалены, используйте

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"
7 голосов
/ 14 ноября 2011

Использовать файлы.

Существуют разные версии. Ранние используют параметры стиля Unix.

Моя версия (для сервера 2000 - не указывайте пробел после переключателей) -

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"

Чтобы добавить файлы файлов в XP, получите exe-файл с ftp: //ftp.microsoft.com/ResKit/y2kfix/x86/

и добавьте его в C: \ WINDOWS \ system32

7 голосов
/ 26 января 2011

Скопируйте этот код и сохраните его как DelOldFiles.vbs.

ИСПОЛЬЗОВАНИЕ ТОЛЬКО В КОМАНДЕ ПОДСКАЗКА: cscript DelOldFiles.vbs 15

15 означает удаление файлов старше 15 дней назад.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here
...