Apa cara paling sederhana untuk secara paksa menghapus direktori dan semua subdirektori di PowerShell? Saya menggunakan PowerShell V2 di Windows 7.
Saya telah belajar dari beberapa sumber bahwa perintah yang paling jelas Remove-Item $targetDir -Recurse -Force
,, tidak bekerja dengan benar. Ini termasuk pernyataan dalam bantuan online PowerShell V2 (ditemukan menggunakan Get-Help Remove-Item -Examples
) yang menyatakan:
... Karena parameter Perulangan di cmdlet ini salah, perintah menggunakan cmdlet Get-Childitem untuk mendapatkan file yang diinginkan, dan menggunakan operator pipa untuk meneruskannya ke cmdlet Remove-Item ...
Saya telah melihat berbagai contoh yang menggunakan Get-ChildItem dan mem -pipe-nya ke Remove-Item , tetapi contoh-contoh itu biasanya menghapus beberapa set file berdasarkan filter, bukan seluruh direktori.
Saya mencari cara paling bersih untuk mengeluarkan seluruh direktori, file, dan direktori anak, tanpa menghasilkan pesan peringatan pengguna dengan menggunakan jumlah kode paling sedikit. Satu kalimat akan menyenangkan jika mudah dimengerti.
sumber
RD /S /Q
rd
adalah alias untukRemove-Item
di PowerShell.cmd /c "rd /s /q"
bekerja, meskipun.Jawaban:
memang berfungsi seperti yang diiklankan di sini.
adalah alias singkatan yang bekerja juga.
Sejauh yang saya mengerti,
-Recurse
parameter tidak berfungsi dengan benar ketika Anda mencoba menghapus satu set file yang difilter secara rekursif. Untuk membunuh satu dir dan semua yang ada di bawah ini sepertinya berfungsi dengan baik.sumber
cmd /c rd
seperti yang dinyatakan di bawah ini.Saya menggunakan:
Ini berfungsi bagi saya seperti pesona (saya mencurinya dari Ubuntu).
sumber
rm
adalah alias untukRemove-Item
di konfigurasi default PowerShell ini. Periksa outputGet-Alias rm
untuk lebih jelasnya. Ini-r
mengambil keuntungan dari perilaku pencocokan parsial PowerShell pada parameter. KarenaRemove-Item
hanya memiliki satu parameter yang dimulai dengan 'r'-Recurse
,,-r
cocok dengan itu. Dengan demikian, berikut semua akan bekerja sama:rm -r
,rm -re
,Remove-Item -Recurse
. (Perhatikan bahwa tidak satu punrm -rf
tidakrm -r -f
akan berfungsi, tetapirm -r -fo
akan. Tidak-rf
cocok dengan parameter dan-f
cocok lebih dari satu.)rm -rf folder
dan tentu saja gagal. Saya awalnya memilih sebagai jawaban (karena katanya Ubuntu). Berkat komentar oleh @chwarr, saya mencoba tanpaf
dan mengambil alias daripada biner rm. Saya berharap Tuan akan memperbarui sumbernya (tidak yakin apakah Tuan tahu itu adalah alias atau benar-benar mengira itu adalah unix rm ;-)-R
bukan-r
(meskipun sejauh yang saya tahu PowerShell seperti sisa Windows tidak peka terhadap huruf besar maka seharusnya tidak membuat perbedaan) tapi saya mendapat kesalahan bahwa folder yang saya coba hapus adalah tidak kosong.Ketika menghapus file secara rekursif menggunakan sederhana
Remove-Item "folder" -Recurse
saya kadang-kadang melihat kesalahan intermiten:[folder] cannot be removed because it is not empty.
Jawaban ini mencoba untuk mencegah kesalahan itu dengan menghapus file secara individual.
Detail penting adalah penyortiran semua item dengan
pspath -Descending
sehingga daun dihapus sebelum akar. Penyortiran dilakukan padapspath
parameter karena memiliki lebih banyak kesempatan bekerja untuk penyedia selain sistem file. The-Include
parameter hanya kenyamanan jika Anda ingin menyaring item untuk menghapus.Ini dibagi menjadi dua fungsi karena saya merasa berguna untuk melihat apa yang akan saya hapus dengan menjalankan
sumber
remove-item -recurse
di Powershell v5 sehingga solusi ini terbaik untuk saya.... bekerja untukku
sumber
Coba contoh ini. Jika direktori tidak ada, tidak ada kesalahan yang muncul. Anda mungkin memerlukan PowerShell v3.0.
sumber
Gunakan perintah DOS old-school:
sumber
/q
(mode Diam, jangan tanya apakah ok untuk menghapus pohon direktori dengan / S) juga.Untuk beberapa alasan, jawaban John Rees terkadang tidak berhasil dalam kasus saya. Tapi itu membawa saya ke arah berikut. Pertama saya mencoba untuk menghapus direktori secara rekursif dengan opsi buggy -recurse. Setelah itu saya turun ke setiap subdir yang tersisa dan menghapus semua file.
sumber
Untuk menghindari kesalahan "Direktori tidak kosong" dari jawaban yang diterima, cukup gunakan perintah DOS lama yang baik seperti yang disarankan sebelumnya. Sintaks PS lengkap yang siap untuk disalin adalah:
sumber
Saya mengambil pendekatan lain yang terinspirasi oleh @ john-rees di atas - terutama ketika pendekatannya mulai gagal bagi saya di beberapa titik. Pada dasarnya, rekur ulang subtree dan urutkan file menurut panjang jalurnya - hapus dari yang terpanjang hingga yang terpendek
Mengenai sihir -LiteralPath, berikut adalah gotchya lain yang mungkin mengenai Anda: https://superuser.com/q/212808
sumber
ATAU
Jika Anda memiliki direktori besar maka apa yang biasanya saya lakukan adalah
Jalankan ini di terminal PowerShell lain dan itu akan berhenti ketika selesai.
sumber
Menghapus seluruh folder pohon kadang-kadang berfungsi dan kadang gagal dengan kesalahan "Direktori tidak kosong". Selanjutnya mencoba memeriksa apakah folder masih ada dapat mengakibatkan kesalahan "Akses Ditolak" atau "Akses Tidak Sah". Saya tidak tahu mengapa ini terjadi, meskipun beberapa wawasan dapat diperoleh dari posting StackOverflow ini .
Saya telah dapat mengatasi masalah ini dengan menentukan urutan item dalam folder yang dihapus, dan dengan menambahkan penundaan. Berikut ini berjalan dengan baik untuk saya:
Artikel Microsoft TechNet Menggunakan Properti Terhitung di PowerShell sangat membantu saya dalam mendapatkan daftar sub-folder yang diurutkan berdasarkan kedalaman.
Masalah keandalan yang serupa dengan RD / S / Q dapat diselesaikan dengan menjalankan DEL / F / S / Q sebelum RD / S / Q dan menjalankan RD untuk kedua kalinya jika perlu - idealnya dengan jeda di antaranya (yaitu menggunakan ping seperti yang ditunjukkan di bawah).
sumber
Sangat sederhana:
sumber
Trik lain yang bermanfaat:
Jika Anda menemukan banyak file dengan konvensi nama yang sama atau mirip (seperti file mac dengan nama awalan dot ... yang menarik file terkenal), Anda dapat dengan mudah menghapusnya dengan satu baris tunggal dari PowerShell seperti ini:
Baris ini akan menghapus semua file dengan titik di awal nama di dalam direktori saat ini, dan semua file dengan keadaan yang sama di dalam folder lain di dalam direktori ini juga. Berhati-hatilah saat menggunakannya. : D
sumber
rm -rf .*
? Saya tidak punya powerhell untuk diuji, tapi saya pikir itu akan berhasil.Untuk menghapus konten lengkap termasuk penggunaan struktur folder
Yang
-recurse
ditambahkan untukremove-item
memastikan permintaan interaktif dinonaktifkan.sumber
Tuliskan di atas untuk membersihkan beberapa file log tanpa menghapus direktori induk dan ini berfungsi dengan baik!
sumber
sumber