Использование подстановочных знаков с командой rmdir или rd

40

Допустим, на D:диске есть какая-то папка :

D:\Air
D:\Abonden
D:\All
D:\Whatever

Я хочу удалить все папки, начинающиеся с «A» (включая все подпапки и файлы). Я попробовал эту команду:

rmdir D:\A* /s /q

Я получаю ошибку, хотя :(

Неверный синтаксис имени файла, имени каталога или метки тома.

Команда delработает с *, но мне нужно также удалить папки.
Есть ли способ добиться этого с помощью rmdirкоманды?

сердар
источник
2
При разработке командных оболочек Windows или DOS никогда не было единообразия и здравого смысла. Грустная часть в том, что когда разрабатывались эти оболочки, были модельные системы, которые пролили бы свет на разумные замыслы. Конечно, оболочка - это всего лишь один пример ужасного несуществующего мыслительного процесса, который привел к тому, что мы собрали этот мусор - я бы хотел рассказать вам, что я действительно думаю, ха-ха.
Рик О'Ши

Ответы:

33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

Используйте это, чтобы проверить, хотя:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

Это выведет команды для запуска в командную строку и позволит вам увидеть, что происходит.

Имейте в виду, что это также будет искать подпапки, такие как "C: \ temp \ jjj \ aaa" и удалит папку aaa. Если вы хотите, чтобы он просто просматривал папки верхнего уровня «C: \ temp \ aaa», то удалите команду "/s"из команды.

Ключ к этому - A *, где вы бы указали строку поиска. Это будет принимать подстановочные знаки, такие как aaa*, aaa*и, *aaa*если вы хотите.

Fazer87
источник
Как есть, команда прервется, если имя пути / папки будет содержать пробелы.
and31415
1
Можем ли мы добавить «ЕСЛИ НЕ СУЩЕСТВУЕТ goto EFO» для A *?
Сердар
3
Это работает, если путь содержит пробелы: for / f "delims ="% i в ('dir / a: d / s / b A *') do rd / s / q "% i"
Луис Кантеро - MSFT
5
Я просто хотел бы добавить, что если вы запускаете это из пакетного файла, то вам нужно использовать два знака процента, чтобы команда стала такой:for /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Фред Клаузен,
нет необходимости использовать флаг 'w / sub' дважды :)
lunicon
25

Удаление папок с использованием подстановочных знаков

rmdir/ rdКоманды в одиночку не поддерживает подстановочные символы (то есть, *и ?). Вы можете обойти это ограничение, заключив его в forцикл.

Пример использования

for /d %G in ("X:\A*") do rd /s /q "%~G"

Примечание. При удалении файлов и папок может потребоваться заменить rdкоманду echoпервой. Таким образом, вы можете гарантировать, что все, что не должно быть удалено, действительно будет.

Несколько моделей

Чтобы удалить несколько папок, соответствующих разным шаблонам, синтаксис не слишком отличается. Как правильно заметил @dbenham, достаточно однострочной команды. Вы также можете указать разные пути:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

Бонус - проверка существования папки

Если вы хотите проверить, существуют ли определенные папки, вы можете использовать следующую команду:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

дальнейшее чтение

and31415
источник
Можем ли мы добавить «ЕСЛИ НЕ СУЩЕСТВУЕТ goto EFO» для A *?
Сердар
Например, мы предполагаем, что нет папки, начинающейся с буквы A. Таким образом, команда должна идти для B *. Я не знаю, смогу ли я объяснить или нет :(
serdar
1
+1 от меня. Я не понимаю, голосование против. Хотя вы можете сделать несколько шаблонов с вашими простыми FOR /Dи FOR /D /Rкомандами. Просто используйте in( "A*" "B*" "C?D" ).
Дбенхем
1
На самом деле вам нужна эта /Rопция, потому что подпапка, соответствующая маске, может находиться под родительским файлом, который этого не делает.
Дбенхем
5
ВНИМАНИЕ: Если вы хотите использовать это решение в файле .bat, вы должны использовать %% G вместо% G, см. Здесь
ValarDohaeris
18

Как никто еще не рассказал ОП о файлах ?!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P это путь - где начинается поиск
/ M - маска поиска, ищущая файлы, которые начинаются с A
/ C - команда для выполнения
/ S - это рекурсивные подпапки (здесь их не было, потому что op не спрашивал)
JJS
источник
2
Это отличный ответ, должен быть принят.
Eacousineau
1
Очень хорошее решение и хорошо объяснил.
Андреас
Полезный ответ: D, но IMO, for /dкак в ответе and31415, и чище, и эффективнее.
Superole
12

Ответ adn31415 правильный, но ломается, если вы поместите это в пакетный или cmd-скрипт. Я часами колотил головой, пока не понял, как ты это используешь.

В командном окне DOS:

for /d %G in ("X:\A*") do rd /s /q "%~G"

В пакетном или cmd скрипте:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

Если вы хотите поместить его в файл «.bat» или «.cmd», вам необходимо удвоить символы «%».

Сэм Б
источник
3
Вы сэкономили мое время на пакетный скрипт!
Туан
без проблем чувак :) Вот почему опубликовал ответ, так как я знал, что он не был очевидным, и больше людей столкнется с ним.
Сэм Б
Можем ли мы добавить исключение, которое нельзя удалить?
Сердар
SET / P PC = ENTER IP ИЛИ ИМЯ ХОСТА для / d %% a in ("\\% PC% \ D $ \ A *. *") Do rd / s / q "%% a" Работает ли этот сценарий правильно ?
Сердар