Remove-Item -Recurse
неожиданно асинхронный , в конечном счете, потому что методы Windows API для удаления файлов и каталогов изначально асинхронны , а Remove-Item
не учитывает за это.
Это периодически, непредсказуемо проявляется одним из двух способов:
Ваш случай: воссоздание удаленного каталога сразу после удаления может завершиться неудачей, поскольку удаление может еще не завершиться к моменту попытки повторного создания.
Более типично: удаление непустого каталога само по себе может завершиться неудачей, если удаление подкаталога или файла еще не завершено к тому времени, когда предпринята попытка удалить родительский каталог - это продемонстрировано в ServerFault ответ Марш ссылки на.
полезный ответ Марша предлагает обходной путь : вместо воссоздав каталог, просто очистите его и используйте его повторно, что обходит проблема.
Однако опорожнение каталог с Get-ChildItem $OUT -Recurse | Remove-Item -Recurse
также подвержен периодическим сбоям , хотя, вероятно, реже.
Эта проблема касается не только Remove-Item
PowerShell, но и cmd.exe
*1047*, а также [System.IO.Directory]::Delete()
:
в .NET
Начиная с 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, ни Remove-Item
, ни rd /s
, ни [System.IO.Directory]::Delete()
работают надежно , поскольку они не в состоянии учитывать асинхронное поведение функций удаления файлов / каталогов API Windows :
Для пользовательской функции PowerShell , которая обеспечивает надежно синхронный обходной путь , см. этот ответ .