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 .