J'essaie de supprimer un répertoire de manière récursive avec rm -Force -Recurse somedirectory
, je reçois plusieurs erreurs "Le répertoire n'est pas vide". Si je réessaie la même commande , cela réussit.
Exemple:
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>
Bien sûr, cela n'arrive pas toujours . En outre, cela ne se produit pas uniquement avec des _svn
répertoires, et je n'ai pas de cache TortoiseSVN ou quoi que ce soit du genre, donc rien ne bloque le répertoire.
Des idées?
la source
@JamesCW: le problème persiste dans PowerShell 4.0
J'ai essayé une autre solution de contournement et cela a fonctionné: utilisez cmd.exe:
la source
iisreset
avant de supprimer et rien ne semble fonctionner de manière fiable . Je vais essayer celui-ci, même si la première fois que je l'ai vu, j'ai hésité à avoir le DOS dans mon Powershell ...rd /s
échoue également par intermittence (bien que apparemment moins souvent queRemove-Item
): github.com/Microsoft/console/issues/309ETA 20181217: PSVersion 4.0 et versions ultérieures échoueront encore dans certaines circonstances, voir réponse alternative de Mehrdad Mirreza et rapport de bogue rédigé par mklement.
mklement fournit une solution de validation de concept à cette réponse SO , car le bogue attend un correctif officiel
La nouvelle version de
PowerShell
(PSVersion 4.0
) a entièrement résolu ce problème etRemove-Item "targetdirectory" -Recurse -Force
fonctionne sans problème de synchronisation.Vous pouvez vérifier votre version en exécutant à
$PSVersiontable
partir de l'ISE ou de l'PowerShell
invite. 4.0 est la version fournie avecWindows 8.1
andServer 2012 R2
, et il peut également être installé sur les versions précédentes de Windows.la source
rd
version. En plus de travailler réellement, c'est environ 3 fois plus rapiderd /s
puisse échouer moins souvent, il est également endommagé - voir ce rapport de bogue .Mise à jour : Apparemment, il est prévu de rendre les API de suppression d'éléments de système de fichiers Windows synchrones, mais elles ne sont pas encore synchrones à partir de Windows 10 version 1903 - voir ce commentaire sur GitHub .
Les réponses existantes permettent d' atténuer le problème, de sorte qu'il se produise moins souvent, mais elles ne résolvent pas la cause première , raison pour laquelle des défaillances peuvent toujours se produire.
Remove-Item -Recurse
est inopinément asynchrone , car les méthodes de l’API Windows pour la suppression de fichiers et de répertoires sont intrinsèquement asynchrones etRemove-Item
ne tiennent pas compte de cela.Cela se manifeste de façon imprévisible de façon intermittente, de deux manières:
Votre cas: La suppression d’un répertoire non vide peut elle-même échouer si la suppression d’un sous-répertoire ou d’un fichier n’est pas terminée au moment où une tentative de suppression du répertoire parent est effectuée.
Plus rarement: la recréation d'un répertoire supprimé immédiatement après la suppression peut échouer, car la suppression n'est peut-être pas encore terminée au moment de la tentative de recréation.
Le problème ne touche que PowerShell de
Remove-Item
, mais aussicmd.exe
estrd /s
ainsi que de .NET[System.IO.Directory]::Delete()
:À partir de Windows PowerShell v5.1 / PowerShell de base 6.2.0-preview.1 /
cmd.exe
10.0.17134.407 / .NET Framework 4.7.03056, Core .NET 2.1, niRemove-Item
, nird /s
, ni[System.IO.Directory]::Delete()
travail fiable , car ils ne tiennent pas compte de l'asynchrone comportement des fonctions de suppression de fichiers / répertoires de l'API Windows :cmd.exe
rapport d'erreurPour une fonction PowerShell personnalisée fournissant une solution de contournement fiable et synchrone , reportez-vous à cette réponse au responsable de la sécurité .
la source
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
La réponse actuelle ne supprimera pas réellement un répertoire, mais seulement ses enfants. De plus, il aura des problèmes avec les répertoires imbriqués, car il essaiera à nouveau de supprimer un répertoire avant son contenu. J'ai écrit quelque chose pour supprimer les fichiers dans le bon ordre, aurait toujours le même problème bien que parfois le répertoire soit toujours là après.
Donc, maintenant, j'utilise quelque chose qui va attraper l'exception, attendre et réessayer (3 fois):
Pour l'instant j'utilise ceci:
la source
Pour supprimer le répertoire et son contenu, vous devez suivre deux étapes. Supprimez d'abord le contenu, puis le dossier lui-même. En utilisant la solution de contournement pour l'élément de suppression récursif défectueux, la solution ressemblerait à ceci:
De cette façon, vous pouvez également supprimer le répertoire parent.
la source
Remove-Item
commande dans laquelle votre tuyauterie a le même problème que celui énoncé à l’origine. Il pourrait tomber sur un élément de répertoire non vide de la même manière.Remove-Item -Recurse
est toujours en cause. Le problème sous-jacent existe toujours à partir de Windows PowerShell version 5.1 / PowerShell Core 6.2.0-preview.1 - voir ce rapport de bogue .Gosh. Beaucoup de réponses. Honnêtement, je préfère celui-ci à tous. C'est super simple, complet, lisible et fonctionne sur n'importe quelle machine Windows. Il utilise la fonctionnalité de suppression récursive (fiable) de .NET et en cas d'échec pour une raison quelconque, il génère une exception appropriée pouvant être gérée avec un bloc try / catch.
Notez que la
Resolve-Path
ligne est importante car .NET ne connaît pas votre répertoire actuel lors de la résolution des chemins de fichiers relatifs. C'est à peu près le seul casse-tête auquel je puisse penser.la source
C'est ce que je travaille:
Cette première ligne supprime tous les fichiers de l'arborescence. La seconde supprime tous les dossiers, y compris le haut.
la source
Remove-Item -Recurse
est toujours en cause. Le problème sous-jacent existe toujours à partir de Windows PowerShell version 5.1 / PowerShell Core 6.2.0-preview.1 - voir ce rapport de bogue .Devenez propriétaire des fichiers / répertoires en utilisant Takeown.exe, puis supprimez-les.
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
la source
J'ai eu ce problème avec un répertoire qui ne serait pas supprimer. J'ai constaté qu'un des sous-dossiers était corrompu et lorsque j'ai essayé de déplacer ou de renommer ce répertoire enfant, un message d'erreur indiquant que quelque chose manquait était affiché. J'ai essayé d'utiliser rm-Force et j'ai eu la même erreur que vous.
Ce qui a fonctionné pour moi, c’était de compresser le répertoire parent à l’aide de 7-zip avec l’option "Supprimer les fichiers après compression" cochée. Une fois compressé, j'ai pu supprimer le fichier zip.
la source