Эту задачу можно выполнить с помощью следующего пакетного файла:
@echo off
pushd "Z:\" || goto :EOF
for /F "eol=| delims=" %%I in ('dir /A-D-H /B /OS "Test_*.txt" 2^>nul') do if %%~zI LEQ 153600 (del "%%I") else goto DeleteOldFiles
:DeleteOldFiles
for /F "skip=5 eol=| delims=" %%I in ('dir /A-D-H /B /O-N "Test_*.txt" 2^>nul') do del "%%I"
popd
Каталог Z:\
устанавливается в качестве текущего каталога с помощью команды PUSHD с выходом из пакетного файла при выполнении с goto :EOF
при ошибке.
Следующая команда FOR выполняется с cmd.exe /C
(точнее %ComSpec% /C
) в отдельном командном процессе в фоновом режиме командной строки:
dir /A-D-H /B /OS "Test_*.txt" 2>nul
Команда DIR выводит
- имена не скрытых файлов из-за опции
/A-D-H
(атрибут не каталог и не скрытый) - в чистом формате без каких-либо дополнительных данных из-за опции
/B
- , упорядоченной по размеру с наименьшим первым и последним по величине файлом из-за опции
/OS
- , совпадающей с шаблоном подстановки
Test_*.txt
в текущем каталоге.
Вывод сообщения об ошибке DIR при не обнаружении какой-либо записи каталога в текущем каталоге, соответствующей этим критериям, подавляется путем перенаправления сообщения об ошибке из дескриптора STDERR на устройство NUL .
Прочтите статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
.Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir
в отдельном командном процессе, запущенном в фоновом режиме.
FOR захватывает все, что записано для обработки STDOUT запущенного командного процесса, и обрабатывает захваченныйвывод построчно после запуска cmd.exe
завершается сам.
FOR с параметром /F
игнорирует пустые строки, которые не возникают при использовании DIR с параметром /B
.
FOR также будет игнорировать строки, начинающиеся с точки с запятой, поскольку ;
является символом конца строки по умолчанию.Имя файла может начинаться с точки с запятой, поэтому лучше переопределить символ конца строки с помощью eol=|
до вертикальной черты, которую ни одно имя файла не может содержать вообще.В этом случае eol=|
не потребуется, поскольку выходные данные DIR являются только именами файлов, начинающимися с Test_
, и поэтому значение по умолчанию eol=;
не нужно перезаписывать с помощью eol=|
.
FOR будет разбивать каждую строку на подстроки (токены) с использованием обычного пробела и горизонтальной табуляции в качестве разделителей и назначать только первую строку с пробелом / табуляцией с разделителями для указанной переменной цикла I
.Это поведение разделения строк отключается с помощью delims=
для определения пустого списка разделителей строк.delims=
в данном случае не является необходимым, поскольку имена файлов резервных копий не содержат пробела.
Команда IF сравнивает si z e текущего файла со значением 153600, равным 150 КиБ , и файл удаляется, если его размер меньше или равен этому значению.
Примечание: Командный процессор Windowsиспользует 32-битную арифметику со знаком.Таким образом, файл с более чем 2 147 483 647 байт (2 GiB ) некорректно обработан этим условием IF .Было бы необходимо обойти это 32-разрядное арифметическое ограничение со знаком, если размер файлов резервных копий может быть больше 2 ГБ.
В противном случае первый цикл завершается с переходом на строку ниже метки DeleteOldFiles
в текущем файле.его размер превышает 150 КБ, поскольку этот файл и все остальные файлы выводятся с помощью DIR после того, как этот файл имеет размер файла, превышающий 150 КБ.
Второй цикл FOR снова запускает команду DIR в отдельном командном процессе в фоновом режиме.Но опция DIR /OS
заменяется на /O-N
, чтобы выводить имена файлов в обратном порядке в соответствии с именем файла.Имя файла с самой новой датой выводится сначала DIR , а имя файла с самой старой датой в имени выводится последним из-за использования международного формата даты в именах файлов.
Второй * 1124Командная строка * FOR дополнительно содержит параметр skip=5
для пропуска первых пяти имен файлов, то есть новейших пяти файлов резервных копий.
Если DIR выводит более пяти имен файлов, все остальные файлы старше, чем первые пять имен выходных файлов удаляются командой DEL , выполняемой безоговорочно секундами FOR .
Наконец, исходный текущий каталог снова устанавливается в качестве текущего каталога, используя POPD .
Для понимания используемых команд и того, как они работают,откройте окно командной строки, выполните там следующие команды и очень внимательно прочитайте все страницы справки, отображаемые для каждой команды.
del /?
dir /?
echo /?
for /?
goto /?
if /?
popd /?
pushd /?
См. Также:
Еще один совет: замените Z:\
на путь UNC , если букве диска Z:
назначен сетевой ресурс.И убедитесь, что пакетный файл выполняется учетной записью, у которой есть разрешения для доступа к сетевому ресурсу и удаления файлов в этой папке на сетевом ресурсе в случае, если этот пакетный файл выполняется как запланированная задача.См. Также Что необходимо учитывать при выполнении командного файла в качестве запланированного задания?