В пределах Windows , окно командной строки следующую командную строку можно использовать для удаления только все файлы (не папки) во всех каталогах data D:\dir и его подкаталогах:
for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"
Эта же командная строка будет записана в командном файле Windows следующим образом:
@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"
Команда FOR выполняется в отдельном командном процессе, запущенном с %ComSpec% /C в фоновом режиме командной строки:
dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"
Переменная среды ComSpec обычно определяется как %SystemRoot%\System32\cmd.exe как это видно при просмотре системных переменных среды в Панели управления Windows - Система - Дополнительные параметры системы - Переменные среды .... Переменная среды SystemRoot определяется по умолчанию с путем к каталогу Windows. Другими словами, FOR выполняется по умолчанию на большинстве ПК с Windows C:\Windows\System32.exe с параметром /C и командной строкой, указанной между (' и ') . См. Также статью в Википедии со списком предопределенных переменных среды Windows .
Команда DIR выводит для обработки STDOUT (стандартный вывод)
- в голом формате из-за опции
/B
- просто имена каталогов из-за опции
/AD (атрибут directory)
- с полным путем из-за опции
/S
- соответствие шаблону подстановки
*data
- в указанном каталоге
D:\dir
- и все его подкаталоги также из-за опции
/S
DIR будет выводить сообщение об ошибке для обработки STDERR (стандартная ошибка) при отсутствии записи каталога, соответствующей этим критериям. Это сообщение об ошибке подавляется путем перенаправления его на устройство NUL с 2>nul .
Таким образом, вывод DIR для данного примера:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
Выход DIR для обработки STDOUT перенаправляется с помощью | обрабатывать STDIN (стандартный ввод) следующей команды FINDSTR.
FINDSTR ищет в потоке, прочитанном из STDIN , построчно
- без учета регистра из-за опции
/I
- буквально интерпретируемая строка
\data
- который должен быть найден в конце строки из-за опции
/E
Итак, FINDSTR выводит для обработки STDOUT фоновой команды, обрабатывая все строки с \data в конце строки, что снова для данного примера:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
Фильтрация вывода команды DIR с помощью FINDSTR необходима для исключения каталога с именем, подобным MyData который также выводится DIR из-за подстановочного знака * который требуется для получения не всех подкаталогов D:\dir\data и его подкаталогов, но всех каталоги data в D:\dir и его подкаталогах.
Прочитайте статью Microsoft об использовании операторов переадресации команд, чтобы получить объяснения 2>nul и | , Операторы перенаправления > и | необходимо экранировать с помощью символа « ^ в командной строке FOR, чтобы интерпретировать его как буквенные символы, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.
FOR с параметром /F захватывает все выходные данные, наконец, для обработки STDOUT запущенного командного процесса и обрабатывает этот вывод построчно после завершения запущенного cmd.exe .
FOR всегда игнорирует пустые строки, но DIR и FINDSTR не выводят пустых строк.
FOR по умолчанию игнорирует также все строки, начинающиеся с ; который является символом конца строки по умолчанию. Но все строки, захваченные FOR, в этом случае не начинаются с точки с запятой, потому что все строки начинаются с D: Так что по умолчанию eol=; можно сохранить. В противном случае eol=| обычно лучше всего подходит для обработки списка имен файлов / папок, поскольку ни одно имя файла / папки не может содержать вертикальную черту.
FOR по умолчанию разделяет каждую строку на подстроки с использованием обычного пробела и символа горизонтальной табуляции в качестве разделителей строк и назначает только первую строку, разделенную пробелом / табуляцией, указанной переменной цикла I Имя папки в пути к каталогу data может содержать символ пробела. По этой причине пустой список разделителей задается с помощью delims= что отключает поведение разбиения строк, в результате чего присваивается переменная цикла I всегда полное имя найденной папки data .
FOR выполняет для каждого каталога data назначенного I команду:
del /A /F /Q "%I\*"
Перед выполнением DEL %I заменяется полным именем каталога, назначенным в настоящий момент переменной I цикла.
Команда DEL предназначена для удаления файлов. Не удаляет каталоги. Параметр /A используется для удаления всех файлов независимо от их атрибутов, включая файлы со скрытым набором атрибутов, которые DEL не будет удалять без параметра /A Параметр /F необходим для принудительного удаления файла с набором атрибутов только для чтения, который не будет удален без параметра /F Параметр /Q используется для подавления запроса, запрашивающего пользователя, действительно ли все файлы, соответствующие * должны быть удалены с помощью DEL.
Полное имя каталога должно быть заключено в двойные кавычки, поскольку оно может содержать пробел или один из этих символов &()[]{}^=;!'+,`~ который требует использования " вокруг строки аргумента команды, как объяснено с помощью CMD на последней странице справки, которая выводится при запуске в окне командной строки cmd /?
Обратите внимание, что DEL не может удалять файлы, для которых у пользователя нет разрешения NTFS на удаление файлов или которые в настоящее время открываются приложением, таким образом, чтобы предотвратить удаление файла во время открытия приложением. DEL выводит сообщение об ошибке для каждого файла, который нельзя удалить из-за отсутствия NTFS или прав доступа к файлу.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
del /?
dir /?
echo /?
findstr /?
for /?