CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Аватара пользователя
Kenwood

CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Kenwood »

Здравствуйте,



У меня возникла задачка: в папке имеются логи за несколько лет. Каждый день программа создает новый файл. Все бы ничего, если бы не возникла потребность удалять файлы по причине отсутсвия места на диске. Можно конечно было вручную снести все файлы, но хочется автоматизировать данный процесс. Так вот, как сделать так, чтобы в одной конкретной папке удалялись файлы старше 1-х суток. Программа каждые сутки создает файл типа: ftp20130301.log, вчера ftp20130228.log и так далее.....



Заранее спасибо
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Iska »

Kenwood, ориентируемся на дату/время последней модификации самого файла или же на дату в его имени?
Аватара пользователя
mariolast

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение mariolast »

Подниму тему.

А если файл вида 2021-05-10-07-42_11.02.038_03565688.ZBF ?

Как тут можно отфильтровать в названии дату?
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Iska »

ИМХО, имеет смысл хранить заданное кол-во логов, например, 2, а остальные удалять, и не задумываться о датах. Главное, чтобы логи бесконечно не накапливались, а батник в назначенном задании это периодически отслеживал. Так как программа каждые сутки создает файл типа: ftpГГГГММДД.log и если ориентируемся на дату/время последней модификации самого файла, то

Код:

Код: Выделить всё

@Echo Off
Set Where=D:\Tmp
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%Where%\%%f"

Если ориентируемся на имена (в идеале, если злодейскими ручками никто логи не правит, результат будет один) For будет иметь вид

Код:

Код: Выделить всё

FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-N 2^>nul`) DO Echo Del "%Where%\%%f"

Если батник в папке с логами, то

Код:

Код: Выделить всё

@Echo Off
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%%f"
или соответственно
FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "ftp*.log" /B /A:-D /O:-N 2^>nul`) DO Echo Del "%%f"

Чуть не забыл, чтобы батник реально удалял файлы, уберите слово Echo (я его вставил для отладки) в For перед командой Del



По идее, можно совсем обойтись без батника, используя CMD и For в назначенном задании, например:

Код:

Код: Выделить всё

cmd /Q /C FOR /F "usebackq skip=2 delims=" %f IN (`DIR "D:\Tmp\ftp*.log" /B /A:-D /O:-N`) DO Del "D:\Tmp\%f" >nul
Аватара пользователя
Kenwood

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Kenwood »

Надо ориентироваться только на дату в его имени
Аватара пользователя
Kenwood

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Kenwood »

Kenwood, тогда можно так:



Код:

Код: Выделить всё

@echo off
setlocal enableextensions enabledelayedexpansion
set sDrive=%~d0
set sPath=%~p0
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i
1>nul wmic.exe DataFile where "Drive='%sDrive%' AND Path='%sPath:\=\\%' AND FileName'ftp%sDateTime:~0,8%' AND Extension ='log'" call Delete
endlocal
exit /b 0

В папке скрипта будут удалены все файлы *.log, за исключением попадающих под маску ftpYYYYMMDD.log текущего дня. Прочие файлы (не *.log) затронуты не будут.
Аватара пользователя
Kenwood

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Kenwood »

Цитата megaloman:



@Echo Off

Set Where=D:\Tmp

FOR /F "usebackq skip=2 delims=" %%f IN (`DIR "%Where%\ftp*.log" /B /A:-D /O:-D /T:W 2^>nul`) DO Echo Del "%Where%\%%f"
CMD/BAT - [решено] Удаление файлов кроме сегодняшнего




Можно попросить объяснить кто знает, что в данном контексте означает: "2^>nul" ?
Аватара пользователя
Kenwood

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Kenwood »

Цитата Freddy1984:



что в данном контексте означает: "2^>nul" ?
CMD/BAT - [решено] Удаление файлов кроме сегодняшнего




Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок)
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Foreigner »

Цитата Foreigner:



Оно в любом контексте перенаправляет STDERR в NULL (т.е. подавляет вывод ошибок)
CMD/BAT - [решено] Удаление файлов кроме сегодняшнего




а цифра "2" означает что будет подавлен вывод двух ошибок?
Аватара пользователя
Freddy1984

Re: CMD/BAT - [решено] Удаление файлов кроме сегодняшнего

Сообщение Freddy1984 »

Цитата Freddy1984:



а цифра "2" означает что будет подавлен вывод двух ошибок?
CMD/BAT - [решено] Удаление файлов кроме сегодняшнего




Нет. «2» означает стандартный поток ошибок (stderr).



Стандартные потоки — Википедия


Перенаправление ввода-вывода — Википедия
Ответить

Вернуться в «Скриптовые языки администрирования Windows»