Tidak ada jawaban yang diposting pada 2018-06-01, dengan pengecualian dari baris perintah tunggal yang diposting oleh foxidrive , benar-benar menghapus semua file dan semua folder / direktori di %PathToFolder%
. Itulah alasan untuk memposting satu jawaban lagi dengan baris perintah tunggal yang sangat sederhana untuk menghapus semua file dan subfolder folder serta file batch dengan solusi yang lebih kompleks menjelaskan mengapa semua jawaban lain yang diposting pada 2018-06-01 menggunakan DEL dan FOR dengan RD gagal membersihkan folder sepenuhnya.
Solusi baris perintah tunggal sederhana yang tentu saja dapat juga digunakan dalam file batch:
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
Baris perintah ini berisi tiga perintah yang dieksekusi satu demi satu.
Perintah pertama PUSHD mendorong jalur direktori saat ini di stack dan selanjutnya membuat %PathToFolder%
direktori saat ini untuk menjalankan proses perintah.
Ini berfungsi juga untuk jalur UNC secara default karena ekstensi perintah diaktifkan secara default dan dalam hal ini PUSHD membuat huruf drive sementara yang menunjuk ke sumber daya jaringan yang ditentukan dan kemudian mengubah drive dan direktori saat ini, menggunakan huruf drive yang baru ditetapkan.
PUSHD menampilkan pesan kesalahan berikut untuk menangani STDERR jika direktori yang ditentukan tidak ada sama sekali:
Sistem tidak mampu menemukan jalur yang ditentukan.
Pesan kesalahan ini ditekan dengan mengarahkannya 2>nul
ke perangkat NUL .
Perintah berikutnya RD dijalankan hanya jika mengubah direktori saat ini untuk proses perintah saat ini ke direktori yang ditentukan berhasil, yaitu direktori yang ditentukan ada sama sekali.
Perintah RD dengan opsi /Q
dan /S
menghapus direktori dengan tenang dengan semua subdirektori bahkan jika direktori yang ditentukan berisi file atau folder dengan atribut tersembunyi atau dengan set atribut read-only. Atribut sistem tidak pernah mencegah penghapusan file atau folder.
Tidak dihapus adalah:
Folder digunakan sebagai direktori saat ini untuk setiap proses yang berjalan. Seluruh pohon folder ke folder tersebut tidak dapat dihapus jika folder digunakan sebagai direktori saat ini untuk setiap proses yang berjalan.
File saat ini dibuka oleh setiap proses yang berjalan dengan izin akses file yang ditetapkan pada file yang terbuka untuk mencegah penghapusan file saat dibuka oleh aplikasi / proses yang sedang berjalan. File yang terbuka seperti itu juga mencegah penghapusan seluruh pohon folder ke file yang dibuka.
File / folder di mana pengguna saat ini tidak memiliki izin yang diperlukan (NTFS) untuk menghapus file / folder yang mencegah juga penghapusan pohon folder ke file / folder ini.
Alasan pertama untuk tidak menghapus folder digunakan oleh baris perintah ini untuk menghapus semua file dan subfolder dari folder yang ditentukan, tetapi bukan folder itu sendiri. Folder ini dibuat sementara direktori saat ini untuk menjalankan proses perintah yang mencegah penghapusan folder itu sendiri. Tentu saja ini menghasilkan keluaran pesan kesalahan dengan perintah RD :
Proses tidak dapat mengakses file karena sedang digunakan oleh proses lain.
File adalah istilah yang salah di sini karena dalam kenyataannya folder sedang digunakan oleh proses lain, proses perintah saat ini yang dieksekusi perintah RD . Ya, dalam kenyataannya folder adalah untuk sistem file file khusus dengan direktori atribut file yang menjelaskan pesan kesalahan ini. Tapi saya tidak ingin masuk terlalu jauh ke manajemen sistem file.
Pesan kesalahan ini, seperti semua pesan kesalahan lainnya, yang dapat terjadi karena tiga alasan yang ditulis di atas, ditekan dengan mengalihkannya 2>nul
dari menangani STDERR ke perangkat NUL .
Perintah ketiga, POPD , dijalankan secara terpisah dari nilai keluar dari perintah RD .
POPD memunculkan jalur direktori yang didorong oleh PUSHD dari tumpukan dan mengubah direktori saat ini untuk menjalankan proses perintah ke direktori ini, yaitu mengembalikan direktori awal saat ini. POPD menghapus huruf drive sementara yang dibuat oleh PUSHD jika ada lintasan folder UNC.
Catatan: POPD dapat secara diam-diam gagal mengembalikan direktori awal saat ini dalam kasus direktori saat ini awal adalah subdirektori dari direktori untuk membersihkan yang tidak ada lagi. Dalam kasus khusus ini %PathToFolder%
tetap direktori saat ini. Jadi disarankan untuk menjalankan baris perintah di atas bukan dari subdirektori dari %PathToFolder%
.
Satu fakta yang lebih menarik :
Saya mencoba baris perintah juga menggunakan jalur UNC dengan berbagi direktori lokal C:\Temp
dengan nama berbagi Temp
dan menggunakan jalur UNC yang \\%COMPUTERNAME%\Temp\CleanTest
ditugaskan ke variabel lingkungan PathToFolder
pada Windows 7. Jika direktori saat ini dalam menjalankan baris perintah adalah subdirektori dari lokal bersama folder diakses menggunakan jalur UNC, yaitu C:\Temp\CleanTest\Subfolder1
, Subfolder1
dihapus oleh RD , dan POPD berikutnya gagal diam-diam dalam membuat C:\Temp\CleanTest\Subfolder1
lagi direktori saat ini sehingga Z:\CleanTest
tersisa sebagai direktori saat ini untuk proses perintah berjalan. Jadi dalam kasus yang sangat, sangat khusus ini, drive sementara akan tetap ada hingga direktori saat ini diubah, misalnya dengancd /D %SystemRoot%
ke direktori lokal benar-benar ada. Sayangnya POPD tidak keluar dengan nilai lebih besar 0 jika gagal mengembalikan direktori awal saat ini sehingga tidak mungkin mendeteksi kondisi kesalahan yang sangat khusus ini hanya dengan menggunakan kode keluar POPD . Namun, dapat diduga bahwa tidak ada yang pernah mengalami kasus kesalahan yang sangat khusus ini karena jalur UNC biasanya tidak digunakan untuk mengakses file dan folder lokal.
Untuk memahami perintah yang digunakan dengan lebih baik, buka jendela command prompt, jalankan di sana perintah berikut, dan baca bantuan yang ditampilkan untuk setiap perintah dengan sangat hati-hati.
Baris tunggal dengan banyak perintah menggunakan file batch Windows menjelaskan operator &&
dan &
digunakan di sini.
Selanjutnya mari kita lihat solusi file batch menggunakan perintah DEL untuk menghapus file %PathToFolder%
dan FOR dan RD untuk menghapus subfolder di %PathToFolder%
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
:EndCleanFolder
endlocal
File batch pertama memastikan bahwa variabel lingkungan PathToFolder
benar-benar didefinisikan dengan path folder tanpa tanda kutip ganda dan tanpa garis miring terbalik di akhir. Garis miring terbalik pada akhirnya tidak akan menjadi masalah, tetapi tanda kutip ganda dalam path folder bisa bermasalah karena nilai PathToFolder
digabungkan dengan string lain selama eksekusi file batch.
Penting adalah dua baris:
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
Perintah DEL digunakan untuk menghapus semua file di direktori yang ditentukan.
- Opsi
/A
ini diperlukan untuk memproses semua file termasuk file dengan atribut tersembunyi yang akan diabaikan oleh DEL tanpa menggunakan opsi /A
.
- Opsi
/F
ini diperlukan untuk memaksa penghapusan file dengan set atribut read-only.
- Opsi
/Q
ini diperlukan untuk menjalankan penghapusan diam-diam dari beberapa file tanpa meminta pengguna jika beberapa file harus benar-benar dihapus.
>nul
diperlukan untuk mengarahkan output dari nama file yang ditulis untuk menangani STDOUT ke perangkat NUL yang tidak dapat dihapus karena file saat ini dibuka atau pengguna tidak memiliki izin untuk menghapus file.
2>nul
diperlukan untuk mengarahkan output pesan kesalahan untuk setiap file yang tidak dapat dihapus dari menangani STDERR ke perangkat NUL .
Perintah FOR dan RD digunakan untuk menghapus semua subdirektori dalam direktori yang ditentukan. Tetapi for /D
tidak digunakan karena FOR mengabaikan dalam hal ini subdirektori dengan set atribut tersembunyi. Untuk alasan for /F
itu digunakan untuk menjalankan baris perintah berikut dalam proses perintah terpisah yang dimulai di latar belakang dengan %ComSpec% /c
:
dir "%PathToFolder%\*" /AD /B 2>nul
Output DIR dalam format telanjang karena /B
entri direktori dengan atribut D
, yaitu nama-nama semua subdirektori dalam direktori yang ditentukan independen pada atribut lain seperti atribut tersembunyi tanpa jalur. 2>nul
digunakan untuk mengarahkan output pesan kesalahan oleh DIR pada direktori tidak ditemukan dari menangani STDERR ke perangkat NUL .
Operator pengalihan >
harus melarikan diri dengan karakter tanda sisipan ^
,, pada baris perintah FOR untuk diartikan sebagai karakter literal ketika penerjemah perintah Windows memproses baris perintah ini sebelum mengeksekusi perintah FOR yang mengeksekusi dir
baris perintah tertanam dalam proses perintah terpisah dimulai. di latar belakang.
UNTUK proses output yang ditangkap ditulis untuk menangani STDOUT dari proses perintah yang dimulai yang merupakan nama subdirektori tanpa path dan tidak pernah dilampirkan dalam tanda kutip ganda.
FOR dengan opsi /F
mengabaikan baris kosong yang tidak muncul di sini karena DIR dengan opsi /B
tidak menampilkan baris kosong.
FOR juga akan mengabaikan garis yang dimulai dengan titik koma yang merupakan akhir dari karakter garis. Nama direktori dapat dimulai dengan titik koma. Untuk alasan eol=|
itu digunakan untuk mendefinisikan karakter bar vertikal sebagai karakter end-of-line yang tidak ada direktori atau file dalam namanya.
FOR akan membagi garis menjadi substring menggunakan spasi dan tab horizontal sebagai pembatas dan akan menetapkan hanya string spasi / tab pertama yang dibatasi untuk variabel loop tertentu I
. Perilaku pemisahan ini tidak diinginkan di sini karena nama direktori dapat berisi satu atau lebih spasi. Oleh karena delims=
itu digunakan untuk mendefinisikan daftar pembatas kosong untuk menonaktifkan perilaku pemisahan baris dan ditugaskan untuk variabel loop I
,, selalu nama direktori lengkap.
Command FOR menjalankan perintah RD untuk setiap nama direktori tanpa jalur yang menjadi alasan mengapa pada baris perintah RD jalur folder harus ditentukan sekali lagi yang digabungkan dengan nama subfolder.
Untuk memahami perintah yang digunakan dan cara kerjanya, buka jendela command prompt, jalankan di sana perintah berikut, dan baca seluruhnya semua halaman bantuan yang ditampilkan untuk setiap perintah dengan sangat hati-hati.
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?