Ich versuche ein Verzeichnis rekursiv mit zu löschen rm -Force -Recurse somedirectory
, es werden mehrere Fehler "Das Verzeichnis ist nicht leer" angezeigt. Wenn ich denselben Befehl erneut versuche , ist er erfolgreich.
Beispiel:
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>
Das passiert natürlich nicht immer . Es kommt auch nicht nur bei _svn
Verzeichnissen vor, und ich habe keinen TortoiseSVN- Cache oder ähnliches, sodass das Verzeichnis nicht blockiert wird.
Irgendwelche Ideen?
quelle
@ JamesCW: Das Problem besteht weiterhin in PowerShell 4.0
Ich habe eine andere Problemumgehung versucht und es hat funktioniert: Verwenden Sie cmd.exe:
quelle
iisreset
Vor dem Löschen anrufen und nichts scheint zuverlässig zu funktionieren . Ich werde es versuchen, obwohl ich, als ich es das erste Mal sah, keine DOS in meiner Powershell haben wollte ...rd /s
Remove-Item
ETA 20181217: PSVersion 4.0 und höher schlägt unter bestimmten Umständen immer noch fehl, siehe alternative Antwort von Mehrdad Mirreza und Fehlerbericht von mklement
mklement bietet eine Proof of Concept-Lösung für diese SO-Antwort , da der Fehler auf eine offizielle Korrektur wartet
Die neue Version von
PowerShell
(PSVersion 4.0
) hat dieses Problem vollständig behoben undRemove-Item "targetdirectory" -Recurse -Force
funktioniert ohne Zeitprobleme.Sie können Ihre Version überprüfen, indem Sie sie
$PSVersiontable
in der ISE oder in derPowerShell
Eingabeaufforderung ausführen. 4.0 ist die mitWindows 8.1
und gelieferte VersionServer 2012 R2
und kann auch auf früheren Windows-Versionen installiert werden.quelle
rd
Version konvertiert . Abgesehen von der eigentlichen Arbeit ist es etwa 3x schnellerrd /s
kann zwar seltener scheitern, ist aber auch kaputt - siehe diesen Fehlerbericht .Update : Scheinbar ist geplant , die APIs zum Entfernen von Windows-Dateisystemelementen zu synchronisieren, diese sind jedoch ab Windows 10, Version 1903, noch nicht synchron - siehe diesen Kommentar zu GitHub .
Die vorhandenen Antworten mindern das Problem, sodass es weniger häufig auftritt, aber die eigentliche Ursache nicht behoben wird. Aus diesem Grund können weiterhin Fehler auftreten.
Remove-Item -Recurse
ist unerwartet asynchron , da die Windows-API-Methoden zum Entfernen von Dateien und Verzeichnissen inhärent asynchron sind undRemove-Item
dies nicht berücksichtigen.Dies äußert sich zeitweise und unvorhersehbar auf zwei Arten:
Ihr Fall: Das Entfernen eines nicht leeren Verzeichnisses selbst kann fehlschlagen, wenn das Entfernen eines Unterverzeichnisses oder einer Datei darin zum Zeitpunkt des Versuchs, das übergeordnete Verzeichnis zu entfernen, noch nicht abgeschlossen ist.
Weniger häufig: Die Neuerstellung eines entfernten Verzeichnisses unmittelbar nach dem Entfernen kann fehlschlagen, da das Entfernen zum Zeitpunkt der Neuerstellung möglicherweise noch nicht abgeschlossen ist.
Das Problem betrifft nicht nur die Powershell
Remove-Item
, sondern auchcmd.exe
‚srd /s
als auch von .NET[System.IO.Directory]::Delete()
:Ab 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, wederRemove-Item
, nochrd /s
, noch[System.IO.Directory]::Delete()
zuverlässig arbeiten , weil sie für die asynchron Konto fehlschlagen Verhalten der Windows-API-Funktionen zum Entfernen von Dateien / Verzeichnissen :cmd.exe
FehlerberichtEine benutzerdefinierte PowerShell-Funktion , die eine zuverlässige synchrone Problemumgehung bietet , finden Sie in dieser SO-Antwort .
quelle
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
Die aktuelle Antwort löscht kein Verzeichnis, sondern nur die untergeordneten Verzeichnisse. Außerdem wird es Probleme mit verschachtelten Verzeichnissen geben, da erneut versucht wird, ein Verzeichnis vor dessen Inhalt zu löschen. Ich habe etwas geschrieben, um die Dateien in der richtigen Reihenfolge zu löschen, hätte aber immer noch das gleiche Problem, obwohl das Verzeichnis manchmal auch danach noch vorhanden wäre.
Also benutze ich jetzt etwas, das die Ausnahme abfängt, warte und versuche es erneut (3 Mal):
Im Moment benutze ich das:
quelle
Das Löschen des Verzeichnisses und seines Inhalts erfolgt in zwei Schritten. Löschen Sie zuerst den Inhalt, dann den Ordner selbst. Wenn Sie die Problemumgehung für das fehlerhafte rekursive Element remove verwenden, sieht die Lösung folgendermaßen aus:
Auf diese Weise können Sie auch das übergeordnete Verzeichnis entfernen.
quelle
Remove-Item
Befehl, an den Ihre Leitung weitergeleitet wird, hat dasselbe Problem wie ursprünglich angegeben. Es könnte auf ein Verzeichniselement stoßen, das auf die gleiche Weise nicht leer ist.Remove-Item -Recurse
ist immer noch involviert. Das zugrunde liegende Problem besteht ab Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 weiterhin - siehe diesen Fehlerbericht .Meine Güte. Viele Antworten. Ich ziehe ehrlich gesagt diesen allen vor. Es ist super einfach, vollständig, lesbar und funktioniert auf jedem Windows-Computer. Es verwendet die (verlässliche) rekursive Löschfunktion von .NET und löst, falls dies aus irgendeinem Grund fehlschlägt, eine richtige Ausnahme aus, die mit einem try / catch-Block behandelt werden kann.
Beachten Sie, dass die
Resolve-Path
Zeile wichtig ist, da .NET Ihr aktuelles Verzeichnis beim Auflösen relativer Dateipfade nicht kennt. Das ist ungefähr das einzige, was mir einfällt.quelle
Das ist, woran ich arbeite:
Diese erste Zeile löscht alle Dateien im Baum. Die zweite löscht alle Ordner einschließlich der obersten.
quelle
Remove-Item -Recurse
ist immer noch involviert. Das zugrunde liegende Problem besteht ab Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 weiterhin - siehe diesen Fehlerbericht .Übernehmen Sie den Besitz der Dateien / Verzeichnisse, indem Sie zuerst Takeown.exe verwenden und dann löschen
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
quelle
Ich hatte dieses Problem mit einem Verzeichnis, das nicht gelöscht werden konnte. Ich habe festgestellt, dass einer der Unterordner beschädigt ist, und als ich versuchte, das untergeordnete Verzeichnis zu verschieben oder umzubenennen, wurde eine Fehlermeldung angezeigt, die besagt, dass etwas fehlt. Ich habe versucht, rm -Force zu verwenden und habe den gleichen Fehler wie Sie erhalten.
Bei mir funktionierte das Komprimieren des übergeordneten Verzeichnisses mit 7-zip, wobei die Option "Dateien nach Komprimierung löschen" aktiviert war. Sobald es komprimiert wurde, konnte ich die Zip-Datei löschen.
quelle