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?


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.


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


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)

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 "%".


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.