Консультация № 185254
22.01.2012, 14:02
0.00 руб.
0 3 2
Здравствуйте! Прошу помощи в следующем вопросе: Мне хотелось бы написать командный файл, который бы удалял в папке все файлы, кроме нескольких наиболее свжих.
Я написал

Set MyFolder=d:\test
Set nNew=6

Дальше что-то не очень получается...

Обсуждение

давно
Мастер-Эксперт
259041
7459
22.01.2012, 16:56
общий
это ответ
Здравствуйте, Посетитель - 391721!
В прилагаемом файле DelOld.cmd (1.3 кб в архиве) Вы можете задавать папку для прог-удаления старых файлов и кол-во свежих файлов, кот-е надо НЕ удалять. Команда Cd /d … проверяет возможность впрыга в заданную папку. Если папка задана ошибочно (не существует) или недоступна, то исполнение сценария прекращается, чтоб не удалять файлы в др папке (немало горя принесло ошибочное удаление начинающим программистам).

Мощная команда Dir /b /a-d /o:-d зачитывает заданный каталог, отбирает Т-КО файлы (без под-папок), сортирует их в порядке новизны (начиная с новых). Кмд For-do отбирает у Dir данные в виде параметра %%f и отправляет в процедуру :Listing для дальнейшей обработки.

Процедура отсчитывает заданное Вами кол-во свежих файлов, не подлежащих удалению, остальные (старые) вписывает в файл-список, который авто-открывается Вам на предвари-обзор. Вы можете отменить, подкорректировать или завершить удаление одним клав-нажатием. Можете избавиться от обзор-паузы и удалять "не глядя" (когда убедитесь, что всё работает как надо).

Подробные комментарии к командам читайте в самом cmd-файле. Чтобы не запуская этот сценарий на исполнение, зачитать/редактировать его прог-текст, дайте из контекста сценария команду "Изменить".
Для получения справок по отдельным командам ( Dir , For , Cd…) дайте эти команды с вопрос-ключём ( Dir /? , For /? ) в окне комстроки ( Пуск \ Выполнить \ Cmd ).
Успехов!
5
давно
Модератор
137394
1850
24.01.2012, 18:54
общий
это ответ
Здравствуйте, Посетитель - 391721!
Вот мой вариант решения
Код:
@echo off

Set MyFolder=d:\test
Set nNew=6

for /f "skip=%nNew% delims=" %%f in ('dir "%MyFolder%" /B /A:-D /O:-D') Do del /F /A: "%MyFolder%\%%f"
Как это работает: в команде For /f в In в обратных апострофах применили команду Dir. Значение ключей посмотрите в подсказке по команде Dir
Это позволяет направить построчно вывод команды Dir в переменную %%f, причём параметр Skip отвечает за то, сколько строк будет пропущено.
Так как команда Dir с указанными ключами указывает только имена /B и только файлов /A:-D и сортирует их по времени в обратном порядке /O:-D (свежие файлы вверху), то далее в команде Del будут удаляться файлы, указанные коммандой Dir после пропуска (Skip=... ) желаемого количества "свежих" файлов. Так как в комманде Del мы прописываем полное имя файлов, нам не нужно находиться в директории, где эти файлы содержатся (при этом помним, что нельзя помещать бат-файл в ту же директорию, что и удаляемые файлы во избежание удаления самого бат-файла). При этом, если указанной директории не существует (если ошиблись при задании имени, например), мы ничем не рискуем - по несуществующему пути ничего не удалится. Смысл ключей команды можно посмотреть как Del /?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
25.01.2012, 19:13
общий
Позволил себе привести код решения уважаемого Алексеев Владимир (Академик), так как оно мне показалось интересным. Мне было бы жалко, если со временем оно пропадёт из-за ограничений на срок хранения файла.
Код:
@Echo off &Echo Executing %0

rem Задам папку для прог-удалени старых фйлв и кол-во свежих фйлв, кот-е надо НЕ удалять.
Set MyFolder=C:\Temp
Set nNew=6

rem Проверю возможнсть назначить заданную папку текущей [существует ли она?].
Cd /d %MyFolder% ||(
rem Не удалось впрыгнуть в заданную папку. Выходим, чтоб ошибочно не удалять файлы в др папке.
Echo Jump to %MyFolder%\ is impossible! Press any key to Exit.&Pause>nul &Exit)

rem Очищу фйл-список накопитель удаляемых фйлв [если он существует в папке Temp].
if exist %tmp%\MustDel.dos Del %tmp%\MustDel.dos

rem Кирил-сообщени [Задано в папке %cd%\ оставить %nNew% файлв:] задам с предыскажением в DOS-кодировке:
Echo.&Echo ╪ ¤ -R ў Ї ЇЄ_ %cd%\ Rбв ўЁвм %nNew% д c<ў:

rem For-Dir передадут в :Listing-процедуру имена всех фйлв в ткщ-папке, начиная с новейшх.
For /f "delims=" %%f in ('Dir /b /a-d /o:-d') do Call :Listing "%%f"

Echo.&if not exist %tmp%\MustDel.dos (
rem фйл MustDel.dos не создался, отображу: [В папке нет файлов для удаления. Жми л клавишу закрыть окно.]
Echo ' Ї ЇЄ_ -_в д c<Rў ¤<п г¤ <_-Ёп. ┼┐Ё < Є< ўЁиг  Єалвм RЄ-R.
Pause>nul &Exit =досроч-выход, удалять нечего)

Echo _г¤гв г¤ <_-л -Ё│_-д c<л:&rem Будут удалены ниже-файлы:
Type %tmp%\MustDel.dos

Echo.&Pause&Echo.&rem тут мож нажать Ctrl+C либо закрыть cmd-окно чтобы отменить намеченное удалени по списку.

rem перед удалением фйлв, зачитанных из списка MustDel.dos, сброшу их защитн атрибуты.
For /f "delims=//" %%f in (%tmp%\MustDel.dos) do Attrib -s -h -r %%f &Del %%f &if not exist %%f Echo %%f is deleted.

Echo.&Echo Press any key to Exit&Pause>nul &Exit =========== Конец фйла.


:Listing эта процедура получает имена фйлв как %1
if %nNew% gtr 0 (
rem счётчик кол-ва фйлв не обнулён, декрементирую его, отображу оставляемые новейш фйлы и выхожу из процы:
Set /a nNew=nNew-1&Echo %1//%~t1&Exit /b 0 )

Echo %1//%~t1>>%tmp%\MustDel.dos
Exit /b 0 записал в фйл-список MustDel.dos очередной старй фйл для удалени. Возвращаюсь из процы в Call-вызыватель.


Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа