Menggunakan wildcard dengan perintah rmdir atau rd

40

Katakanlah ada beberapa folder di D:drive:

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

Saya ingin menghapus semua folder yang dimulai dengan "A" (termasuk semua subfolder dan file). Saya mencoba perintah ini:

rmdir D:\A* /s /q

Saya mendapatkan kesalahan, meskipun :(

Nama file, nama direktori, atau sintaks label volume tidak benar.

The delperintah bekerja dengan *, tetapi saya perlu menghapus folder juga.
Apakah ada cara untuk mencapainya melalui rmdirperintah?

serdar
sumber
2
Keseragaman dan akal sehat tidak pernah berperan dalam pengembangan cangkang perintah Windows atau DOS. Bagian yang menyedihkan adalah ada sistem model di luar sana ketika cangkang ini dikembangkan yang akan menjelaskan desain cerdas. Tentu saja cangkang hanyalah salah satu contoh dari proses pemikiran yang mengerikan sampai tidak ada yang masuk ke menampar bersama sampah ini - saya berharap saya bisa memberi tahu Anda apa yang sebenarnya saya pikirkan, ha ha.
Rick O'Shea

Jawaban:

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

Gunakan ini untuk menguji:

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

Ini akan mem-pipe keluar perintah yang akan dijalankan ke command prompt dan memungkinkan Anda untuk melihat apa yang terjadi.

Ingatlah bahwa ini juga akan mencari subfolder seperti "C: \ temp \ jjj \ aaa" dan akan menghapus folder aaa. Jika Anda ingin hanya melihat folder tingkat atas "C: \ temp \ aaa", kemudian hapus "/s"dari perintah.

Kunci untuk ini adalah A *, tempat Anda memasukkan string pencarian Anda. Ini akan menerima wildcard seperti aaa*, aaa*dan *aaa*jika Anda menginginkannya.

Fazer87
sumber
As-is, perintah akan terputus jika nama path / folder berisi karakter spasi.
and31415
1
Bisakah kita menambahkan "JIKA TIDAK ADA EFO goto" untuk A *?
serdar
3
Ini berfungsi jika path berisi karakter spasi: untuk / f "delims ="% i in ('dir / a: d / s / b A *') lakukan rd / s / q "% i"
Luis Cantero - MSFT
5
Saya hanya ingin menambahkan bahwa jika menjalankan ini dari dalam file batch maka Anda perlu menggunakan tanda dua persen sehingga perintah menjadifor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen
tidak perlu menggunakan bendera 'w / sub' dua kali :)
lunicon
25

Menghapus folder menggunakan wildcard

The rmdir/ rdperintah saja tidak mendukung karakter wildcard (yaitu, *dan ?). Anda dapat mengatasi batasan ini dengan membungkusnya dalam satu forlingkaran.

Contoh penggunaan

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

Catatan Saat Anda menghapus file dan folder, Anda mungkin ingin mengganti rdperintah dengan yang echopertama. Dengan cara ini Anda dapat memastikan apa pun yang seharusnya tidak dihapus akan benar-benar terjadi.

Banyak pola

Untuk menghapus beberapa folder yang cocok dengan pola yang berbeda, sintaksinya tidak terlalu berbeda. Seperti @dbenham dengan benar tunjukkan, satu perintah baris sudah cukup. Anda juga dapat menentukan jalur yang berbeda:

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

Bonus - Memeriksa keberadaan folder

Jika Anda ingin memeriksa apakah folder tertentu ada, Anda dapat menggunakan perintah berikut:

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

Bacaan lebih lanjut

and31415
sumber
Bisakah kita menambahkan "JIKA TIDAK ADA EFO goto" untuk A *?
serdar
Misalnya kita anggap tidak ada folder yang dimulai dengan huruf A. Jadi perintah harus digunakan untuk B *. Saya tidak tahu apakah saya bisa menjelaskan atau tidak :(
serdar
1
+1 dari saya. Saya tidak mengerti suara turun. Meskipun Anda dapat melakukan beberapa pola dengan perintah FOR /Ddan sederhana Anda FOR /D /R. Cukup gunakan in( "A*" "B*" "C?D" ).
dbenham
1
Sebenarnya Anda memerlukan /Ropsi karena subfolder yang cocok dengan mask mungkin berada di bawah induk yang tidak.
dbenham
5
PERINGATAN: Jika Anda ingin menggunakan solusi ini dalam file .bat, Anda harus menggunakan %% G alih-alih% G, lihat di sini
ValarDohaeris
18

Bagaimana belum ada yang memberi tahu OP tentang forfile ?!

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

/ P adalah pathname - di mana pencarian dimulai
/ M adalah mask pencarian, mencari file yang dimulai dengan A
/ C adalah perintah untuk dieksekusi
/ S adalah subfolder rekursif (tidak termasuk di sini, karena op tidak bertanya)
JJS
sumber
2
Ini adalah jawaban yang sangat baik, harus menjadi jawaban yang diterima.
eacousineau
1
Solusi yang sangat bagus dan dijelaskan dengan baik.
Andreas
Jawaban yang berguna: D tetapi IMO for /dseperti pada jawaban and31415 lebih bersih dan lebih efisien.
Superole
12

adn31415 jawaban sudah benar tetapi rusak jika Anda menempatkan ini dalam skrip batch atau cmd. Saya membenturkan kepala saya selama berjam-jam sampai saya tahu ini adalah bagaimana Anda menggunakannya.

Di jendela perintah DOS:

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

Dalam skrip Batch atau cmd:

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

Jika Anda ingin memasukkannya ke file ".bat" atau ".cmd", Anda harus menggandakan karakter "%".

Sam B
sumber
3
Anda menghemat waktu saya untuk skrip Batch!
Tuan
tidak ada masalah Bung :) Itu sebabnya memposting jawabannya karena saya tahu itu tidak jelas dan lebih banyak orang akan mengalami itu.
Sam B
Bisakah kita menambahkan pengecualian untuk tidak dihapus?
serdar
SET / P PC = ENTER IP ATAU NAMA PEMBAWA ACARA untuk / d %% a in ("\\% PC% \ D $ \ A *. *") Lakukan rd / s / q "%% a" Apakah scritpt ini bekerja dengan baik ?
serdar