Я использую Windows 10.
У меня есть много папок с одинаковыми именами (например, «data») в разных подкаталогах базового каталога (здесь «d:\dir»).
Как удалить содержимое (содержащее только файлы) всех папок с именем «data», не удаляя их самих?
Например, для трех папок:
d:\dir\data d:\dir\tmp1\data d:\dir\tmp3\tmp2\data
решение1
В окне командной строки 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\*"
КомандаДЛЯвыполняет в отдельном командном процессе, запущенном %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. Другими словамиДЛЯвыполняется по умолчанию на большинстве ПК с Windows C:\Windows\System32.exe
с опцией /C
и командной строкой, указанной между ('
и ')
. См. также статью Википедии со списком предопределенныхПеременные среды Windows.
КомандаДИРвыходы для обработкиСТАНДАРТНЫЙ ВЫВОД(стандартный вывод)
- в голом формате из-за опции
/B
- только имена каталогов из-за опции
/AD
(атрибут каталог) - с полным путем из-за опции
/S
- соответствие шаблону подстановочных знаков
*data
- в указанном каталоге
D:\dir
- и все его подкаталоги также из-за опции
/S
.
ДИРвыведет сообщение об ошибке для обработкиСТДЕРР(стандартная ошибка) при отсутствии записи каталога, соответствующей этим критериям. Это сообщение об ошибке подавляется путем перенаправления его на устройствоНУЛЕВОЙс 2>nul
.
Итак, выводДИРдля данного примера:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
ВыходДИРобрабатыватьСТАНДАРТНЫЙ ВЫВОДперенаправлен с помощью |
для обработкиСТДИН(стандартный ввод) следующей командыFINDSTR.
FINDSTRпоиск в потоке прочитан изСТДИНпострочно
- регистр не учитывается из-за опции
/I
- буквально интерпретированная строка
\data
- который должен быть найден в конце строки из-за опции
/E
.
ТакFINDSTRвыходы для обработкиСТАНДАРТНЫЙ ВЫВОДфоновой команды обработать все строки с \data
конца строки, что для данного примера снова:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
Фильтрация вывода командыДИРсFINDSTRнеобходимо исключить каталог с таким именем, MyData
который также выводитсяДИРиз-за подстановочного знака *
, который требуется для вывода не всех подкаталогов D:\dir\data
и его подкаталогов, а всех data
каталогов в D:\dir
и его подкаталогах.
Прочитайте статью Microsoft оИспользование операторов перенаправления команддля объяснения 2>nul
и |
. Операторы перенаправления >
и |
должны быть экранированы символом вставки ^
наДЛЯкомандная строка будет интерпретироваться как буквальные символы, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением командыДЛЯкоторый выполняет встроенную dir
командную строку в отдельном командном процессе, запущенном в фоновом режиме.
ДЛЯс опцией /F
захватывает все выходные данные, чтобы в конечном итоге обработатьСТАНДАРТНЫЙ ВЫВОДзапущенного командного процесса и обрабатывает этот вывод построчно после завершения запущенного процесса cmd.exe
.
Пустые строки всегда игнорируютсяДЛЯ, но пустых строк не выводитсяДИРиFINDSTR.
ДЛЯигнорирует по умолчанию также все строки, начинающиеся с , ;
который является символом конца строки по умолчанию. Но все строки, захваченныеДЛЯв этом случае никогда не начинайте с точки с запятой, поскольку все строки начинаются с . Поэтому можно оставить D:
значение по умолчанию . В противном случае обычно лучше всего подходит для обработки списка имен файлов/папок, поскольку ни одно имя файла/папки не может содержать вертикальную черту.eol=;
eol=|
ДЛЯпо умолчанию разделит каждую строку на подстроки, используя обычный пробел и символ горизонтальной табуляции в качестве разделителей строк, и назначит указанной переменной цикла только первую строку, разделенную пробелом/табуляцией I
. Имя папки в пути к каталогу data
может содержать символ пробела. По этой причине указан пустой список разделителей, с помощью delims=
которого отключается поведение разбиения строк, в результате чего переменной цикла всегда назначается I
полное квалифицированное имя найденной data
папки.
ДЛЯвыполняется для каждого data
каталога, назначенного I
команде:
del /A /F /Q "%I\*"
%I
заменяется перед выполнениемДЕЛпо полному имени каталога, назначенному в данный момент переменной цикла I
.
КомандаДЕЛдля удаления файлов. Он не удаляет каталоги. Опция /A
используется для удаления всех файлов независимо от их атрибутов, включая файлы со скрытым набором атрибутов, которыеДЕЛне будет удален без параметра /A
. Параметр /F
необходим для принудительного удаления файла с установленным атрибутом «только для чтения», который не будет удален без параметра /F
. Параметр /Q
используется для подавления запроса пользователя, действительно ли все файлы, соответствующие параметру , *
должны быть удалены параметромДЕЛ.
Полное имя каталога должно быть заключено в двойные кавычки, поскольку оно может содержать пробел или один из этих символов, &()[]{}^=;!'+,`~
что требует использования "
вокруг строки аргумента команды, как объясняется в справкеКМД на последней странице справки, которая выводится при запуске в окне командной строки cmd /?
.
Обратите внимание, чтоДЕЛневозможно удалить файлы, на которые у пользователя нет разрешений NTFS на удаление файлов или которые в данный момент открыты приложением таким образом, что удаление файла во время его открытия приложением невозможно.ДЕЛвыводит сообщение об ошибке для каждого файла, который не может быть удален из-за отсутствия прав NTFS или прав доступа к файлу.
Чтобы понять используемые команды и принцип их работы, откройте окно командной строки, выполните в нем следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
del /?
dir /?
echo /?
findstr /?
for /?
решение2
Следуя вашему примеру, вам придется позвонить:
Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item
решение3
Рекурсивно перечислить все папки с именем «data», затем удалить их содержимое.
$base_dir = 'D:\dir'
$name = 'data'
Get-ChildItem $base_dir -Recurse -Force | Where-Object {
$_.PSIsContainer -and
$_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
Remove-Item "$_\*" -Recurse -Force
}
В PowerShell v3 и более поздних версиях можно заменить условие фильтра, $_.PSIsContainer
используя параметр -Directory
с Get-ChildItem
.