Używanie symboli wieloznacznych z komendą rmdir lub rd

40

Powiedzmy, że na D:dysku jest jakiś folder :

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

Chcę usunąć wszystkie foldery zaczynające się od „A” (w tym wszystkie podfoldery i pliki). Próbowałem tego polecenia:

rmdir D:\A* /s /q

Pojawia się błąd :(

Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna.

delKomenda pracuje *, ale muszę usuwać foldery, jak również.
Czy istnieje sposób, aby to osiągnąć za pomocą rmdirpolecenia?

serdar
źródło
2
Jednolitość i zdrowy rozsądek nigdy nie były uwzględniane przy opracowywaniu powłok poleceń systemu Windows lub DOS. Smutne jest to, że istniały systemy modelowe, kiedy te skorupy zostały opracowane, które rzuciłyby światło na inteligentne projekty. Oczywiście skorupa jest tylko jednym z przykładów okropnego lub nieistniejącego procesu myślowego, który doprowadził do splotu tych śmieci - chciałbym móc powiedzieć ci, co naprawdę myślę, ha ha.
Rick O'Shea

Odpowiedzi:

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

Użyj tego do przetestowania:

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

Spowoduje to odpływ poleceń do uruchomienia w wierszu poleceń i pozwoli ci zobaczyć, co się dzieje.

Pamiętaj, że przeszuka to również podfoldery, takie jak „C: \ temp \ jjj \ aaa”, i usunie folder aaa. Jeśli chcesz, aby po prostu spojrzał na foldery najwyższego poziomu „C: \ temp \ aaa”, usuń "/s"polecenie z polecenia.

Kluczem do tego jest A *, w którym należy wpisać szukany ciąg. Będzie to zaakceptować symbole wieloznaczne, takie jak aaa*, aaa*a *aaa*jeśli chcesz go.

Fazer87
źródło
Tak jak jest, polecenie zostanie przerwane, jeśli nazwa ścieżki / folderu zawiera spacje.
i31415
1
Czy możemy dodać „IF NOT EXIST goto EFO” dla A *?
serdar
3
Działa to, jeśli ścieżka zawiera znaki spacji: for / f "delims ="% i in ('dir / a: d / s / b A *') do rd / s / q "% i"
Luis Cantero - MSFT
5
Chciałbym tylko dodać, że jeśli uruchamiasz to z pliku wsadowego , musisz użyć dwóch znaków procentu, aby polecenie brzmiałofor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen
nie trzeba dwa razy używać flagi „w / sub” :)
Lunicon
25

Usuwanie folderów za pomocą symboli wieloznacznych

Samo polecenie rmdir/ rdnie obsługuje symboli wieloznacznych (czyli *i ?). Możesz obejść to ograniczenie, zawijając je w forpętli.

Przykładowe użycie

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

Uwaga: Podczas usuwania plików i folderów może być konieczne zastąpienie rdpolecenia w echopierwszej kolejności. W ten sposób możesz zapewnić, że wszystko, czego nie powinno się usunąć, faktycznie by to zrobiło.

Wiele wzorów

Aby usunąć wiele folderów pasujących do różnych wzorców, składnia nie jest zbyt różna. Jak słusznie zauważył @dbenham, wystarczy jedno-wierszowe polecenie. Możesz także określić różne ścieżki:

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

Bonus - Sprawdzanie istnienia folderu

Jeśli chcesz sprawdzić, czy istnieją określone foldery, możesz użyć następującego polecenia:

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

Dalsza lektura

i31415
źródło
Czy możemy dodać „IF NOT EXIST goto EFO” dla A *?
serdar
Na przykład przypuszczamy, że nie ma folderu rozpoczynającego się na literę A. Więc polecenie musi iść po B *. Nie wiem, czy mógłbym wyjaśnić czy nie :(
serdar
1
+1 ode mnie Nie rozumiem głosowania w dół. Chociaż możesz wykonywać wiele wzorów za pomocą prostych FOR /Di FOR /D /Rpoleceń. Po prostu użyj in( "A*" "B*" "C?D" ).
dbenham
1
W rzeczywistości potrzebujesz tej /Ropcji, ponieważ podfolder pasujący do maski może znajdować się pod rodzicem, który tego nie robi.
dbenham
5
OSTRZEŻENIE: Jeśli chcesz użyć tego rozwiązania w pliku .bat, musisz użyć %% G zamiast% G, patrz tutaj
ValarDohaeris
18

Jak nikt jeszcze nie powiedział OP o plikach ?!

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

/ P to nazwa ścieżki - od której rozpoczyna się wyszukiwanie
/ M to maska ​​wyszukiwania, która szuka plików rozpoczynających się od A
/ C to polecenie do wykonania
/ S to rekurencyjne podfoldery (nie zostały tu uwzględnione, ponieważ operacja nie zapytała)
JJS
źródło
2
To doskonała odpowiedź, powinna być zaakceptowana.
eacousineau
1
Bardzo dobre rozwiązanie i dobrze wyjaśnione.
Andreas,
Przydatna odpowiedź: D, ale IMO for /djak w odpowiedzi and31415 jest zarówno czystsze, jak i bardziej wydajne.
Superole,
12

adn31415 odpowiedź jest poprawna, ale psuje się, jeśli umieścisz ją w skrypcie wsadowym lub cmd. Waliłem głową przez wiele godzin, dopóki nie zorientowałem się, jak tego używasz.

W oknie poleceń DOS:

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

W skrypcie wsadowym lub cmd:

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

Jeśli chcesz umieścić go w pliku „.bat” lub „.cmd”, musisz podwoić znaki „%”.

Sam B.
źródło
3
Zaoszczędziłeś mój czas na skrypt Batch!
Tuan,
nie ma problemu, koleś :) Dlatego opublikowałem odpowiedź, ponieważ wiedziałem, że to nie było oczywiste i będzie więcej osób.
Sam B,
Czy możemy dodać wykluczenie, którego nie można usunąć?
serdar
SET / P PC = ENTER IP OR HOST NAME for / d %% a in ("\\% PC% \ D $ \ A *. *") Do rd / s / q "%% a" Czy ten wpis działa poprawnie ?
serdar