Estou tentando excluir um diretório recursivamente rm -Force -Recurse somedirectory
, recebo vários erros "O diretório não está vazio". Se eu tentar novamente o mesmo comando , ele será bem-sucedido.
Exemplo:
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>
Claro, isso nem sempre acontece . Além disso, isso não acontece apenas com _svn
diretórios, e eu não tenho um cache do TortoiseSVN ou algo assim, então nada está bloqueando o diretório.
Alguma ideia?
fonte
@ JamesCW: O problema ainda existe no PowerShell 4.0
Tentei outra solução alternativa e funcionou: use cmd.exe:
fonte
iisreset
antes de excluir e nada parece funcionar de maneira confiável . Vou tentar um presente, mesmo que quando eu vi pela primeira vez eu recusou-se a ter DOS dentro da minha Powershell ...rd /s
falha intermitentemente (embora aparentemente com menos frequênciaRemove-Item
): github.com/Microsoft/console/issues/309ETA 20181217: PSVersão 4.0 e posterior ainda falhará em algumas circunstâncias, consulte resposta alternativa de Mehrdad Mirreza e relatório de bug arquivado por mklement
O mklement fornece uma solução de Prova de Conceito nesta resposta SO , pois o bug aguarda uma correção oficial
A nova versão do
PowerShell
(PSVersion 4.0
) resolveu esse problema completamente eRemove-Item "targetdirectory" -Recurse -Force
funciona sem problemas de tempo.Você pode verificar sua versão executando
$PSVersiontable
de dentro do ISE ouPowerShell
prompt. 4.0 é a versão que acompanhaWindows 8.1
eServer 2012 R2
, e também pode ser instalada em versões anteriores do Windows.fonte
rd
versão. Além de realmente trabalhando, é sobre 3x mais rápidord /s
possa falhar com menos frequência, ele também está quebrado - consulte este relatório de bug .Atualização : aparentemente há planos de tornar as APIs de remoção de itens do sistema de arquivos do Windows síncronas, mas ainda não são síncronas a partir da versão 10 do Windows 10 1903 - veja este comentário no GitHub .
As respostas existentes atenuam o problema, para que ocorra com menos frequência, mas não abordam a causa raiz , e é por isso que as falhas ainda podem ocorrer.
Remove-Item -Recurse
é inesperadamente assíncrono , em última análise, porque os métodos da API do Windows para remoção de arquivos e diretórios são inerentemente assíncronos eRemove-Item
não são responsáveis por isso.Isso de forma intermitente e imprevisível se manifesta de uma das duas maneiras:
Seu caso: A remoção de um diretório não vazio em si pode falhar, se a remoção de um subdiretório ou arquivo nele ainda não tiver sido concluída no momento em que for feita uma tentativa de remover o diretório pai.
Menos comum: A recriação de um diretório removido imediatamente após a remoção pode falhar, porque a remoção pode não ter sido concluída ainda no momento em que a recriação é tentada.
O problema não afeta apenas os PowerShell
Remove-Item
, mas tambémcmd.exe
osrd /s
.NET[System.IO.Directory]::Delete()
:A partir do Windows PowerShell v5.1 / PowerShell Core 6.2.0-
cmd.exe
preview.1 / 10.0.17134.407 / .NET Framework 4.7.03056, .NET Core 2.1, nemRemove-Item
, nemrd /s
, nem[System.IO.Directory]::Delete()
funciona de maneira confiável , porque eles não respondem pelos dados assíncronos comportamento das funções de remoção de arquivos / diretórios da API do Windows :cmd.exe
relatório de erroPara uma função personalizada do PowerShell que fornece uma solução confiável e síncrona , consulte esta resposta do SO .
fonte
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
A resposta atual não excluirá um diretório, apenas seus filhos. Além disso, ele terá problemas com diretórios aninhados, pois novamente tentará excluir um diretório antes de seu conteúdo. Eu escrevi algo para excluir os arquivos na ordem correta, ainda teria o mesmo problema, embora às vezes o diretório ainda estivesse por aí depois.
Então, agora eu uso algo que irá capturar a exceção, aguardar e tentar novamente (3 vezes):
Por enquanto estou usando isso:
fonte
Para excluir o diretório e seu conteúdo, são necessários dois passos. Primeiro exclua o conteúdo e depois a própria pasta. Usando a solução alternativa para o item de remoção recursiva com defeito, a solução seria assim:
Dessa forma, você também pode remover o diretório pai.
fonte
Remove-Item
comando no qual sua tubulação tem o mesmo problema que foi declarado originalmente. Pode tropeçar em um item de diretório que não está vazio da mesma maneira.Remove-Item -Recurse
ainda está envolvido. O problema subjacente ainda existe no Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - consulte este relatório de bug .Poxa. Muitas respostas. Sinceramente, prefiro este sobre todos eles. É super simples, completo, legível e funciona em qualquer máquina Windows. Ele usa a funcionalidade de exclusão recursiva do .NET (confiável) e, se falhar por algum motivo, lança uma exceção adequada que pode ser tratada com um bloco try / catch.
Observe que a
Resolve-Path
linha é importante porque o .NET não está ciente de seu diretório atual ao resolver caminhos de arquivos relativos. Essa é a única pegadinha que consigo pensar.fonte
Isto é o que eu tenho trabalhando:
Essa primeira linha exclui todos os arquivos da árvore. O segundo exclui todas as pastas, incluindo a parte superior.
fonte
Remove-Item -Recurse
ainda está envolvido. O problema subjacente ainda existe no Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - consulte este relatório de bug .Tome posse dos arquivos / diretórios primeiro usando Takeown.exe e exclua
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
fonte
Eu tive esse problema com um diretório que não seria excluído. Descobri que uma das subpastas estava corrompida e quando tentei mover ou renomear o diretório filho, recebi uma mensagem de erro dizendo algo sobre a falta dele. Tentei usar o rm -Force e obtive o mesmo erro que você.
O que funcionou para mim foi compactar o diretório pai usando o 7-zip com a opção "Excluir arquivos após a compactação" marcada. Uma vez compactado, pude excluir o arquivo zip.
fonte