Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я искал в Интернете и нашел несколько примеров с сотнями строк кода, а другие, которые требовали установки дополнительных утилит командной строки для выполнения этой задачи.
Подобные вещи можно сделать в BASH всего за пару строк кода. Кажется, что-то хотя бы удаленно можно сделать для пакетных файлов в Windows. Я ищу решение, которое работает в стандартной командной строке Windows, без каких-либо дополнительных утилит. Пожалуйста, не PowerShell или Cygwin либо.
Ответы:
Наслаждаться:
Смотрите
forfiles
документацию для более подробной информации.Для получения дополнительной информации см . Индекс AZ в командной строке Windows XP .
Если вы не
forfiles
установили его на свой компьютер, скопируйте его с любого Windows Server 2003 на компьютер с Windows XP по адресу%WinDir%\system32\
. Это возможно, поскольку EXE-файл полностью совместим с Windows Server 2003 и Windows XP.Более поздние версии Windows и Windows Server устанавливают его по умолчанию.
Для Windows 7 и новее (включая Windows 10):
Синтаксис немного изменился. Поэтому обновленная команда:
источник
Запустите следующие команды :
Переместите все файлы (используя / mov, который перемещает файлы, а затем удаляет их, в отличие от / move, который перемещает целые деревья файлов, которые затем удаляются), через robocopy в другое место, а затем выполните команду удаления по этому пути, и вы все хорошо.
Также, если у вас есть каталог с большим количеством данных, вы можете использовать
/mir
переключательисточник
rd /s /q c:\destination
вместоdel
команды, хотя или даже использовать другойrobocopy /mir c:\emptydir c:\destination
запуск, чтобы очистить каталог, если вы ожидаете проблемы с именами файлов.forfiles
из принятого ответа не подойдет.C:\test
старше 7 дней. Чтобы удалить файлы, изменитьecho
наdel
:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
Ok немного соскучился и придумал это, которое содержит мою версию замены эпохи Linux для бедного человека, ограниченную для ежедневного использования (без сохранения времени):
7daysclean.cmd
ПРИМЕНЕНИЕ
set /a strip=day*7
: Измените 7 на количество дней, чтобы сохранить.set dSource=C:\temp
: Это начальный каталог для проверки файлов.НОТЫ
Это неразрушающий код, он будет отображать то, что случилось бы.
Изменить :
что-то вроде:
поэтому файлы на самом деле удаляются
Февраль : жестко запрограммирован до 28 дней. Бессекстильные годы - адское дополнение, действительно. если у кого-то есть идея, которая не добавит 10 строк кода, продолжайте и отправьте сообщение, чтобы я добавил его в свой код.
эпоха : я не принял во внимание время, так как необходимо удалить файлы старше определенной даты, так как часы / минуты удалили бы файлы со дня, который предназначался для хранения.
ОГРАНИЧЕНИЕ
Эпоха считает само собой разумеющимся, ваш короткий формат даты ГГГГ-ММ-ДД. Его необходимо адаптировать для других настроек или оценки времени выполнения (прочитайте sShortTime, пользовательскую конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).
Я упоминал, что ненавижу автоформатирование этого редактора? он удаляет пустые строки, а копирование-вставка - ад.
Надеюсь, это поможет.
источник
7daysclean.cmd
звучит как удивительное название для группы Synth-Punk.Вы должны сделать
/d -3
(3 дня назад) Это прекрасно работает для меня. Таким образом, все сложные партии могут быть в мусорном ведре. Такжеforfiles
не поддерживаются пути UNC, поэтому установите сетевое соединение с конкретным диском.источник
*.*
? Подстановочный знак*.*
не соответствует всем файлам в Windows. Он соответствует только файлам с.
их именами. ОП никогда не говорил ничего о требовании.
в имени файла. Правильный параметр есть/M *
, но это все равно по умолчанию. Там нет необходимости/M
вообще.*.*
ведет себя точно так же, как*
в Windows. Фактически, я только что попробовал это на своем компьютере, иdir *.*
действительно перечислилtest file
, файл без расширения.*.*
противоречит, скажем,dir
и-m
вариантуforfiles
.-m *.*
Маска действительно пропустить extensionless имена файлов, как я уже говорил в моем комментарии выше (попробуйте сами). Самое смешное в том, что в документации MS явно указано, что-m *.*
это по умолчанию. Однако, если вы попробуете это в реальной жизни, вы увидите, что по умолчанию на самом деле-m *
- все файлы повторяются.*.*
маска применяется ко всем файлам. Мой риторический вопрос об «этой странной привычке» был действительно неуместен, поскольку трактовка*.*
и*
эквивалентность - это давняя конвенция Windows. Тем не менее,/m
вариантforfiles
по какой-то причине нарушает это соглашение.Посмотрите на мой ответ на похожий вопрос :
Это удаляет файлы старше указанной даты. Я уверен, что это может быть изменено, чтобы вернуться на семь дней от текущей даты.
обновление: я заметил, что HerbCSO улучшил вышеупомянутый сценарий. Я рекомендую использовать его версию вместо.
источник
Моя команда
@PATH
- это просто путь в моем случае, поэтому мне пришлось использовать@PATH\@FILE
тоже
forfiles /?
не работает для меня тоже, ноforfiles
(без "?") работал нормально.И единственный вопрос, который у меня есть: как добавить несколько масок (например, « .log | .bak»)?
Все это в отношении forfiles.exe, которое я скачал здесь (на win XP)
Но если вы используете сервер Windows, forfiles.exe уже должен быть, и он отличается от версии ftp. Вот почему я должен изменить команду.
Для Windows Server 2003 я использую эту команду:
источник
Часто есть относительные вопросы, связанные с датой и временем, которые нужно решить с помощью командного файла. Но интерпретатор командной строки cmd.exe не имеет функции для вычисления даты / времени. Множество хороших рабочих решений, использующих дополнительные консольные приложения или скрипты, уже размещены здесь, на других страницах Stack Overflow и на других веб-сайтах.
Общим для операций, основанных на дате / времени, является требование преобразования строки даты / времени в секунды с определенного дня. Очень часто встречается 1970-01-01 00:00:00 UTC. Но любой последующий день также может быть использован в зависимости от диапазона дат, необходимого для поддержки конкретной задачи.
Джей опубликовал 7daysclean.cmd, содержащий быстрое решение «дата-секунды» для интерпретатора командной строки cmd.exe . Но это не учитывает правильных високосных лет. JR опубликовал дополнение для учета високосного дня в текущем году, но игнорирует другие високосные годы с базового года, то есть с 1970 года.
Уже более 20 лет я использую статические таблицы (массивы), созданные один раз с небольшой функцией C, для быстрого получения количества дней, включая високосные дни, с 1970-01-01 в функциях преобразования даты / времени в моих приложениях, написанных на C / C ++.
Этот очень быстрый табличный метод может быть использован также в пакетном коде с использованием команды FOR . Поэтому я решил закодировать пакетную подпрограмму,
GetSeconds
которая вычисляет количество секунд с 1970-01-01 00:00:00 UTC для строки даты / времени, переданной этой подпрограмме.Примечание. Дополнительные секунды не учитываются, поскольку файловые системы Windows также не поддерживают дополнительные секунды.
Сначала таблицы:
Дни с 1970-01-01 00:00:00 UTC для каждого года, включая високосные дни.
Вычисление секунд для года с 2039 по 2106 с началом эпохи 1970-01-01 возможно только с использованием 32-разрядной переменной без знака, то есть без знака long (или без знака int) в C / C ++.
Но cmd.exe использует для математических выражений 32-битную переменную со знаком. Поэтому максимальное значение составляет 2147483647 (0x7FFFFFFF), что равно 2038-01-19 03:14:07.
Информация о високосном году (нет / да) за период с 1970 по 2106 гг.
Количество дней до первого дня каждого месяца в текущем году.
Преобразование даты в число секунд с 1970-01-01 довольно легко с помощью этих таблиц.
Внимание, пожалуйста!
Формат строк даты и времени зависит от региона Windows и языковых настроек. Разделители и порядок маркеров , присвоенных переменных среды
Day
,Month
иYear
в первом ДЛЯ циклеGetSeconds
должна быть адаптирована к местным формата даты / времени , если это необходимо.Необходимо адаптировать строку даты переменной среды, если формат даты в переменной среды DATE отличается от формата даты, используемого командой FOR on
%%~tF
.Например , когда
%DATE%
расширяется вSun 02/08/2015
то время как%%~tF
раскрывается в02/08/2015 07:38 PM
коде ниже может быть использован с модификации линии 4:Это приводит к простой передаче подпрограммы
02/08/2015
- строки даты без трех букв сокращения дня недели и символа разделяющего пробела.В качестве альтернативы можно использовать следующую для передачи текущей даты в правильном формате:
Теперь последние 10 символов из строки даты передаются в функцию,
GetSeconds
и поэтому не имеет значения, является ли строка даты переменной среды DATE с или без дня недели, если день и месяц всегда имеют 2 цифры в ожидаемом порядке, то есть в форматеdd/mm/yyyy
илиdd.mm.yyyy
.Вот код пакета с поясняющими комментариями, который просто выводит, какой файл удалить и какой файл хранить в
C:\Temp
дереве папок, см. Код первого цикла FOR .Для оптимальной производительности лучше всего удалить все комментарии, то есть все строки, начинающиеся с rem после 0-4 пробелов.
Кроме того, массивы можно уменьшить, т. Е. Уменьшить временной диапазон с 1980-01-01 00:00:00 до 2038-01-19 03:14:07, что в настоящее время поддерживается вышеуказанным кодом пакета, например, до 2015-01 От -01 до 2019-12-31, как показано в приведенном ниже коде, который действительно удаляет файлы старше 7 дней в
C:\Temp
дереве папок.Далее код партии ниже оптимизирован для 24-часового формата времени.
Более подробную информацию о форматах даты и времени и сравнениях времени файлов в Windows см. В моем ответе « Узнайте, если файл старше 4 часов в пакетном файле, с большим количеством дополнительной информации о времени файла».
источник
Скопируйте этот код и сохраните его как
DelOldFiles.vbs
.ИСПОЛЬЗОВАНИЕ В CMD:
cscript //nologo DelOldFiles.vbs 15
15 означает удалить файлы старше 15 дней назад.
источник
Для Windows Server 2008 R2:
Это удалит все файлы .sql старше 90 дней.
источник
Используйте forfiles.
Есть разные версии. Ранние используют параметры стиля Unix.
Моя версия (для сервера 2000 - обратите внимание, нет места после переключателей) -
Чтобы добавить файлы в XP, получите exe-файл с ftp://ftp.microsoft.com/ResKit/y2kfix/x86/
и добавьте его в C: \ WINDOWS \ system32
источник
*.*
вforfiles
не соответствует всем файлам. Он сопоставляет только файлы с.
их именами (т.е. файлы с расширениями). ОП никогда не говорил ничего о требовании.
в имени файла. Правильный параметр есть/M *
, но это все равно по умолчанию. Там нет необходимости/M
вообще.Для Windows 2012 R2 будет работать следующее:
чтобы увидеть файлы, которые будут удалены, используйте это
источник
IMO, JavaScript постепенно становится универсальным стандартом сценариев: он, вероятно, доступен в большем количестве продуктов, чем любой другой язык сценариев (в Windows он доступен с использованием Windows Scripting Host). Я должен вычистить старые файлы во многих папках, поэтому для этого есть функция JavaScript:
Чтобы очистить каждую папку, просто добавьте еще один вызов в функцию clearFolder (). Этот конкретный код также сохраняет файлы exe и dll, а также очищает подпапки.
источник
Как насчет этой модификации на 7daysclean.cmd для учета високосного года?
Это можно сделать менее чем за 10 строк кода!
Редактировать Mofi:
Условие, указанное выше JR, всегда оценивается как ложное из-за неверного синтаксиса.
И
Month GEQ 2
это также неправильно, потому что добавление 86400 секунд для еще одного дня должно выполняться в високосный год только для месяцев с марта по декабрь, но не для февраля.Рабочий код для учета високосного дня - только в текущем году - в командном файле 7daysclean.cmd, опубликованном Джэй , будет:
источник
Могу ли я добавить скромный вклад в эту и без того ценную тему. Я обнаружил, что другие решения могут избавиться от фактического текста ошибки, но игнорируют% ERRORLEVEL%, который сигнализирует об ошибке в моем приложении. И я законно хочу% ERRORLEVEL%, только если это не ошибка «Файлы не найдены».
Некоторые примеры:
Отладка и устранение ошибки, в частности:
Использование oneliner для возврата ERRORLEVEL успеха или неудачи:
Использование oneliner для поддержания ERRORLEVEL на нуле для успеха в контексте пакетного файла посреди другого кода (ver> nul сбрасывает ERRORLEVEL):
Для шага задания агента SQL Server CmdExec я обнаружил следующее. Я не знаю, является ли это ошибкой, но CmdExec на этом шаге распознает только первую строку кода:
источник
Гоша, ответов уже много. Простой и удобный маршрут, который я нашел, состоял в том, чтобы выполнить ROBOCOPY.EXE дважды в последовательном порядке из одной инструкции командной строки Windows, используя параметр & .
В этом примере он работает, выбирая все файлы ( . ) Старше 30 дней и перемещая их в целевую папку. Вторая команда делает то же самое снова с добавлением команды PURGE, которая означает удаление файлов в целевой папке, которые не существуют в исходной папке. По сути, первая команда перемещает файлы, а вторая удаляет, потому что они больше не существуют в исходной папке при вызове второй команды.
Обратитесь к документации ROBOCOPY и используйте переключатель / L при тестировании.
источник
Если у вас есть набор ресурсов XP, вы можете использовать robocopy, чтобы переместить все старые каталоги в один каталог, а затем использовать rmdir, чтобы удалить только этот:
источник
Я думаю, что ответ e.James хорош, так как он работает с неизмененными версиями Windows уже в Windows 2000 SP4 (и, возможно, раньше), но требует записи во внешний файл. Вот модифицированная версия, которая не создает внешний текстовый файл при сохранении совместимости:
Чтобы быть верным исходному вопросу, здесь он находится в сценарии, который выполняет ВСЕ математические расчеты за вас, если вы вызываете его с числом дней в качестве параметра:
ПРИМЕЧАНИЕ. Приведенный выше код учитывает високосные годы, а также точное количество дней в каждом месяце. Единственный максимум - это общее количество дней, прошедших с 0/0/0 (после этого он возвращает отрицательные годы).
ПРИМЕЧАНИЕ: математика идет только в одну сторону; он не может правильно получить будущие даты из отрицательных входных данных (он попытается, но, скорее всего, пройдет после последнего дня месяца).
источник
Вы можете быть в состоянии осуществить это. Вы можете взглянуть на этот вопрос , для более простого примера. Сложность наступает, когда вы начинаете сравнивать даты. Может быть легко определить, является ли дата большей или нет, но есть много ситуаций, которые необходимо учитывать, если вам нужно получить разницу между двумя датами.
Другими словами - не пытайтесь изобрести это, если вы действительно не можете использовать сторонние инструменты.
источник
в этом нет ничего удивительного, но мне нужно было сделать что-то подобное сегодня и запустить как запланированное задание и т. д.
командный файл, DelFilesOlderThanNDays.bat ниже с примером exec w / params:
источник
Разбираясь в ответе аку, я вижу много людей, спрашивающих о путях UNC. Простое сопоставление пути unc с буквой диска порадует forfiles. Сопоставление и удаление сопоставлений дисков может быть сделано программно в пакетном файле, например.
Это удалит все файлы с расширением .gz старше 7 дней. Если вы хотите убедиться, что Z: не отображается ни перед чем другим, вы можете сделать что-то простое, как
источник
РОБОКОПИЯ прекрасно работает для меня. Первоначально предложил мой Иман. Но вместо того, чтобы перемещать файлы / папки во временную папку, а затем удалять содержимое временной папки, перемещайте файлы в корзину !!!
Это несколько строк моего резервного файла, например:
Он удаляет все, что старше 15 дней, из папки «Temp» и 30 дней - из папки «AutoCAD». Я использую переменные, потому что строка может быть довольно длинной, и я могу использовать их для других мест. Вам просто нужно найти путь до вашей корзины, связанной с вашим логином.
Это на рабочем компьютере для меня, и это работает. Я понимаю, что у некоторых из вас могут быть более ограничительные права, но все равно попробуйте;) Поищите в Google объяснения по параметрам ROBOCOPY.
Ура!
источник
Мой скрипт для удаления файлов старше определенного года:
источник
Этот сделал это для меня. Он работает с датой, и вы можете вычесть нужную сумму в годах, чтобы вернуться во времени:
/F
вcmd /c del @path /F
силах файла конкретного быть удален в некоторых случаях файл может быть только для чтения.dateYear
это год Variable и там вы можете изменить для вычитания собственных нуждисточник