В пределах 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 /?