Використання підстановок з командою 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*якщо ви цього хочете.


Як є, команда порушиться, якщо ім'я шляху / папки містить пробіли.
і31415

1
Чи можемо ми додати "ЯКЩО НЕ ІСНУЄТЬСЯ goto EFO" для A *?
сердар

3
Це працює, якщо шлях містить символи простору: for / f "delims ="% i in ('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.

Подальше читання


Чи можемо ми додати "ЯКЩО НЕ ІСНУЄТЬСЯ goto EFO" для A *?
сердар

Наприклад, ми припускаємо, що немає папки, що починається з літери A. Отже команда повинна йти за B *. Я не знаю, чи міг би я пояснити чи ні :(
сердар

1
+1 від мене. Я не розумію голосування проти. Хоча ви можете робити кілька шаблонів за допомогою своїх простих FOR /Dі FOR /D /Rкоманд. Просто використовуйте in( "A*" "B*" "C?D" ).
dbenham

1
Насправді вам потрібен /Rваріант, тому що підпапка, що відповідає масці, може бути під батьківською, яка цього не робить.
dbenham

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 - рекурсивні вкладені папки (тут не вказано, тому що оп не запитував)

2
Це відмінна відповідь, має бути прийнятою.
eacousineau

1
Дуже вдале рішення та добре пояснене.
Андреас

Корисна відповідь: D, але IMO, for /dяк у відповіді та 31415, є і більш чистим, і ефективнішим.
Суперол

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 = Введіть IP або Ім'я хоста для / d %% a in ("\\% PC% \ D $ \ A *. *") Виконайте rd / s / q "%% a" Чи правильно працює цей скрипт ?
сердар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.