Это часто случается со мной с моими автоматизированными скриптами сборки.
Я думаю, что причиной может быть какое-то приложение, которое имеет открытый файл в этом каталоге с “share delete”. Т.е. приложение позволяет удалить файл (вот почему я думаю, что вызов DeleteFile не даст сбой), но файл исчезнет только после того, как указанное приложение закроет свой хэндл.
Это означает, что файл может все еще быть там, когда команда rmdir
пытается удалить папку, отсюда и сообщение об ошибке. Вскоре после этого, указанное приложение закроет свой handle, файл исчезнет, и когда вы осмотрите папку, чтобы увидеть, какой файл rmdir
говорил о ней, будет пустым.
По крайней мере, это моя теория.
Обходной путь, предложенный Harry Johnston, выглядит неплохо. Только я бы вставил паузу между командами rmdir
. Конечно, Windows не имеет легко писать “паузу” команды (исправление: старые версии Windows не, более новые есть - см. комментарии). Но если секунд гранулярности достаточно, можно использовать ping
для создания паузы:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Так что в общей сложности:
rd /s /q foo
:: retry once
if exist foo (
:: clear errorlevel
cmd /c
:: pause
ping -n 2 127.0.0.1 >nul
:: retry
rd /s /q foo
)
:: retry yet again
if exist foo (
cmd /c
ping -n 2 127.0.0.1 >nul
rd /s /q foo
)
:: give up
if exist foo {panic}