Saya mencoba menghapus direktori secara rekursif rm -Force -Recurse somedirectory
, saya mendapatkan beberapa kesalahan "Direktori tidak kosong". Jika saya coba lagi perintah yang sama , itu berhasil.
Contoh:
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (RunTime:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Data:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (FileHelpers.Tests:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (nunit:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Libs:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (I:\Documents an...net\FileHelpers:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
PS I:\Documents and Settings\m\My Documents\prg\net>
Tentu saja, ini tidak selalu terjadi . Juga, itu tidak terjadi hanya dengan _svn
direktori, dan saya tidak memiliki cache TortoiseSVN atau hal-hal seperti itu sehingga tidak ada yang menghalangi direktori.
Ada ide?
sumber
@ JamesCW: Masalahnya masih ada di PowerShell 4.0
Saya mencoba solusi lain dan berhasil: gunakan cmd.exe:
sumber
iisreset
sebelum menghapus dan tidak ada yang bekerja andal . Saya akan mencoba yang ini, walaupun ketika pertama kali melihatnya saya menolak keras untuk memiliki DOS di dalam Powershell saya ...rd /s
gagal sesekali juga (meskipun tampaknya lebih jarangRemove-Item
): github.com/Microsoft/console/issues/309ETA 20181217: PSVersion 4.0 dan yang lebih baru masih akan gagal dalam beberapa keadaan, lihat jawaban alternatif oleh Mehrdad Mirreza , dan laporan bug yang diajukan oleh mklement
mklement menyediakan solusi Bukti Konsep pada jawaban SO ini , karena bug sedang menunggu perbaikan resmi
Versi baru
PowerShell
(PSVersion 4.0
) telah menyelesaikan masalah ini sepenuhnya danRemove-Item "targetdirectory" -Recurse -Force
berfungsi tanpa masalah waktu.Anda dapat memeriksa versi Anda dengan menjalankan
$PSVersiontable
dari dalam ISE atauPowerShell
prompt. 4.0 adalah versi yang disertakan bersamaWindows 8.1
danServer 2012 R2
, dan dapat diinstal pada versi Windows sebelumnya juga.sumber
rd
versi. Selain benar-benar berfungsi, ini sekitar 3x lebih cepatrd /s
mungkin gagal lebih jarang, itu juga rusak - lihat laporan bug ini .Pembaruan : Tampaknya ada rencana untuk membuat API penghapusan item-sistem file Windows sinkron, tetapi mereka belum sinkron pada Windows 10 versi 1903 - lihat komentar ini di GitHub .
Jawaban yang ada mengurangi masalah, sehingga jarang terjadi, tetapi mereka tidak mengatasi akar penyebabnya , itulah sebabnya kegagalan masih bisa terjadi.
Remove-Item -Recurse
secara tak terduga tidak sinkron , pada akhirnya karena metode Windows API untuk penghapusan file dan direktori secara inheren tidak sinkron danRemove-Item
tidak menjelaskan hal itu.Ini sebentar-sebentar, tak terduga dapat dimanifestasikan dalam salah satu dari dua cara:
Kasus Anda: Menghapus direktori nonempty itu sendiri bisa gagal, jika penghapusan subdirektori atau file di dalamnya belum selesai pada saat upaya dilakukan untuk menghapus direktori induk.
Lebih jarang: Menciptakan direktori yang dihapus segera setelah penghapusan bisa gagal, karena penghapusan mungkin belum selesai pada saat penciptaan kembali dicoba.
The Masalah tidak hanya mempengaruhi PowerShell ini
Remove-Item
, tetapi jugacmd.exe
'srd /s
serta NET[System.IO.Directory]::Delete()
:Pada Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 /
cmd.exe
10.0.17134.407 / .NET Framework 4.7.03056, .NET Core 2.1, tidakRemove-Item
, jugard /s
, atau[System.IO.Directory]::Delete()
bekerja dengan andal , karena mereka gagal untuk memperhitungkan asinkron perilaku fungsi penghapusan / direktori file Windows API :cmd.exe
laporan bugUntuk fungsi PowerShell khusus yang menyediakan solusi sinkronisasi yang andal , lihat jawaban SO ini .
sumber
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
Jawaban saat ini sebenarnya tidak akan menghapus direktori, hanya anak-anaknya. Selain itu akan ada masalah dengan direktori bersarang karena akan mencoba menghapus direktori sebelum isinya. Saya menulis sesuatu untuk menghapus file dalam urutan yang benar, masih akan memiliki masalah yang sama meskipun kadang-kadang direktori masih ada setelahnya.
Jadi, sekarang saya menggunakan sesuatu yang akan menangkap pengecualian, tunggu, dan coba lagi (3 kali):
Untuk saat ini saya menggunakan ini:
sumber
Untuk menghapus direktori dan isinya dibutuhkan dua langkah. Pertama-tama hapus isinya, lalu folder itu sendiri. Menggunakan solusi untuk item hapus rekursif yang salah solusinya akan terlihat seperti ini:
Dengan cara ini Anda dapat menghapus direktori induk juga.
sumber
Remove-Item
perintah perpipaan Anda ke memiliki masalah yang sama yang awalnya menyatakan. Mungkin tersandung pada item direktori yang tidak kosong dengan cara yang sama.Remove-Item -Recurse
masih terlibat. Masalah mendasar masih ada pada Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - lihat laporan bug ini .Astaga. Banyak jawaban. Jujur saya lebih suka yang ini daripada mereka semua. Ini sangat sederhana, lengkap, dapat dibaca, dan bekerja di semua mesin Windows. Ia menggunakan fungsionalitas penghapusan rekursif .NET (andal) dan jika gagal karena suatu alasan, ia mengeluarkan pengecualian yang dapat ditangani dengan blok coba / tangkap.
Perhatikan bahwa
Resolve-Path
jalur ini penting karena .NET tidak mengetahui direktori Anda saat ini ketika menyelesaikan jalur file relatif. Itu tentang satu-satunya gotcha yang bisa saya pikirkan.sumber
Inilah yang saya kerjakan:
Baris pertama ini menghapus semua file di pohon. Yang kedua menghapus semua folder termasuk bagian atas.
sumber
Remove-Item -Recurse
masih terlibat. Masalah mendasar masih ada pada Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - lihat laporan bug ini .Ambil kepemilikan file / direktori terlebih dahulu menggunakan Takeown.exe lalu hapus
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
sumber
Saya punya masalah dengan direktori yang tidak mau dihapus. Saya menemukan bahwa salah satu subfolder rusak dan ketika saya mencoba untuk memindahkan atau mengganti nama anak itu dir saya mendapat pesan kesalahan mengatakan sesuatu tentang hal itu hilang. Saya mencoba menggunakan rm -Force dan mendapatkan kesalahan yang sama seperti yang Anda lakukan.
Apa yang berhasil bagi saya adalah mengompresi dir induk menggunakan 7-zip dengan opsi "Hapus file setelah kompresi" dicentang. Setelah dikompresi, saya bisa menghapus file zip.
sumber