Пакетный файл для удаления файлов старше N дней

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

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

вопрос задан 9.09.2008
Kibbee
50900 репутация

24 ответов


  • 0 рейтинг

    Если у вас есть комплект ресурсов XP, вы можете использовать robocopy, чтобы переместить все старые каталоги в один каталог, а затем использовать rmdir, чтобы удалить только этот:

    mkdir c:\temp\OldDirectoriesGoHere
    robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
    rmdir /s /q c:\temp\OldDirectoriesGoHere
    
    ответ дан neuracnu, с репутацией 89, 8.12.2010
  • 0 рейтинг

    Как насчет этой модификации на 7daysclean. cmd чтобы принять во внимание високосный год?

    Это можно сделать менее чем за 10 строк кода!

    set /a Leap=0
    if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
    set /a Months=!_months!+Leap
    

    Редактировать от Mofi:

    Вышеуказанное условие внесено J. Р. всегда оценивается как false из-за неверного синтаксиса.

    и Month GEQ 2 также неверны, потому что добавление 86400 секунд для еще одного дня должно выполняться в високосный год только для месяцев с марта по декабрь, но не для февраля.

    Рабочий код для учета високосного дня - только в текущем году - в пакетном файле 7daysclean. cmd опубликовал Jay будет:

    set "LeapDaySecs=0"
    if %Month% LEQ 2 goto CalcMonths
    set /a "LeapRule=Years%%4"
    if %LeapRule% NEQ 0 goto CalcMonths
    rem The other 2 rules can be ignored up to year 2100.
    set /A "LeapDaySecs=day"
    :CalcMonths
    set /a Months=!_months!+LeapDaySecs
    
    ответ дан J.R., с репутацией 51, 1.07.2010
  • 0 рейтинг

    Возможно, вам удастся это осуществить. Вы можете взглянуть на этот вопрос , для более простого примера. Сложность наступает, когда вы начинаете сравнивать даты. Может быть легко определить, является ли дата большей или нет, но есть много ситуаций, которые необходимо учитывать, если вам нужно получить разницу между двумя датами.

    Другими словами - не пытайтесь изобретать это, если вы действительно не можете использовать сторонние инструменты.

    ответ дан Paulius, с репутацией 4474, 9.09.2008
  • 0 рейтинг

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

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

    См. forfile документацию для более подробной информации.

    Для получения дополнительной информации см. Индекс A-Z командной строки Windows XP .

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

    Более поздние версии Windows и Windows Server установили его по умолчанию.

    для Windows 7:

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

    forfiles /p "C:\what\ever" /s /m *.* /D - /C "cmd /c del @path"
    

    ответ дан aku, с репутацией 96429, 9.09.2008
  • 0 рейтинг

    Хорошо, немного соскучился и придумал это, в котором содержится моя версия замены эпохи 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 строк кода, продолжайте и отправьте сообщение, чтобы я добавил его в свой код.

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

    ОГРАНИЧЕНИЕ

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

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

    Я надеюсь, что это помогает.

    ответ дан Jay, с репутацией 1406, 24.08.2009
  • 0 рейтинг

    Моя команда

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

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

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

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

    Все это в отношении файлов. Отлично, что я скачал здесь (на win XP)

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

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

    forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"
    
    ответ дан segero, с репутацией 111, 14.12.2010
  • 0 рейтинг

    Вы, вероятно, не найдете полностью неинсталляционное решение, кроме сложного bat-файла или скрипта Windows. Я использую delen , помещаю его в системный каталог, а затем использую его как обычную команду del в любом файле bat.

    ответ дан bryan314, с репутацией 27, 9.09.2008
  • 0 рейтинг

    Посмотрите на мой ответ на аналогичный вопрос :

    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 улучшил вышеупомянутый скрипт. Я рекомендую вместо него использовать его версию .

    ответ дан e.James, с репутацией 79902, 24.08.2009