Самое простое решение - создать каталог, из которого временно удаляются такие файлы, как C:\Temp\Test
, активный каталог.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Size is in bytes
set "min.size=100000"
set "FullBatchFileName=%~f0"
pushd "C:\Temp\Test"
rem Do nothing if the command line above fails unexpected.
if errorlevel 1 goto EndBatch
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B /OS 2^>nul') do if not "%FullBatchFileName%" == "%%~fI" if %%~zI LSS %min.size% ( del "%%I" ) else goto DeletionDone
:DeletionDone
popd
:EndBatch
endlocal
Командная строка DIR выполняется FOR в отдельном командном процессе, запущенном с cmd.exe /C
в фоновом режиме, и FOR захватывает все строки, выводимые DIR для обработки STDOUT .Сообщение об ошибке, выданное DIR для обработки STDERR при обнаружении не скрытого файла в текущем каталоге, перенаправляется с 2>nul
на устройство NUL для его подавления.
Прочтите также статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
.Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir
в отдельном командном процессе, запущенном в фоновом режиме.
Опция DIR /OS
приводит к выводу списка не скрытых файлов с помощью DIR упорядоченный по размеру с наименьшим первым и наибольшим последним.
FOR будет пропускать строки, начинающиеся с точки с запятой, что означает, что он будет пропускать файлы, имя файла которых начинается с ;
, то естьв общем возможно.Этого можно избежать, указав eol=|
вертикальную черту в качестве символа конца строки, который не может содержать имя файла.
FOR разделит строки на подстроки с использованием обычного пробела и горизонтальной табуляциив качестве разделителя и назначит только первую подстроку переменной цикла I
.Имена файлов могут содержать один или несколько пробелов.Поэтому delims=
используется для определения пустого списка разделителей, которые полностью отключают разделение строк и присваиваются переменной цикла I
полное имя файла.
Условие IF if not "%FullBatchFileName%" == "%%~fI"
сравнивает регистрозависимое полное имя файла пакета (диск + путь + имя + расширение) с полным именем текущего файла.Это условие имеет значение true , если текущий файл не является текущим пакетным файлом.
Следующее условие IF if %%~zI LSS %min.size%
сравнивает размер файла текущего преобразованного файла.в 32-разрядное целое число со знаком с указанным размером файла, также преобразованное в 32-разрядное целое число со знаком.Это сравнение размеров файлов не выполняется для файлов с 2 GiB или более, поскольку размер такого большого файла превышает максимальное положительное 32-разрядное целое число со знаком 2147483647.
Цикл FOR завершается с goto DeletionDone
в первой строке, размер файла которого равен или превышает указанный минимальный размер, поскольку все последующие файлы, выводимые DIR , определенно имеют размер файла, равный или превышающий указанный минимальный размер, посколькувыходные данные упорядочены по размеру от наименьшего к наибольшему.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
call /?
... поясняет %~f0
... полное имя файла аргумента 0 - текущий исполняемый пакетный файл. dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
popd /?
pushd /?
rem /?
set /?
setlocal /?