As respostas existentes mitigam o problema, de modo que ocorra com menos frequência, mas não abordam a causa raiz , razão pela qual as falhas ainda podem ocorrer.
Remove-Item -Recurse
é inesperadamente assíncrono , em última análise, porque os métodos API do Windows para remoção de arquivos e diretórios são inerentemente assíncronos e Remove-Item
não não conta para isso.
Isso intermitentemente, imprevisivelmente se manifesta de duas maneiras:
-
Seu caso: A remoção de um diretório não vazio pode falhar, caso a remoção de um subdiretório ou arquivo ainda não tenha sido concluída até que seja feita uma tentativa de remover o diretório pai.
-
Menos comumente: a recriação de um diretório removido imediatamente após a remoção pode falhar, porque a remoção pode ainda não ter sido concluída quando a recriação for tentada.
O problema afeta não apenas o Remove-Item
do PowerShell, mas também o cmd.exe
do rd /s
, além do [System.IO.Directory]::Delete()
do .NET:
A partir do Windows PowerShell v5.1 / Pré-visualização do PowerShell Core 6.2.0.1 / cmd.exe
10.0.17134.407 / .NET Framework 4.7.03056, .NET Core 2.1, nenhum Remove-Item
, nem rd /s
, nem [System.IO.Directory]::Delete()
funcionam de forma confiável , porque eles não levam em consideração o comportamento assíncrono das funções de remoção de diretório / arquivo da API do Windows :
Para uma função personalizada do PowerShell que fornece uma solução síncrona confiável , consulte esta resposta SO .