Dużo się to dzieje z moimi skryptami do automatycznego budowania.
Myślę, że powodem może być jakaś aplikacja, która ma plik otwarty w tym katalogu z “share delete”. Tzn. aplikacja pozwala na usunięcie pliku (dlatego uważam, że wywołanie DeleteFile nie zakończy się niepowodzeniem), ale plik zniknie dopiero po zamknięciu jego uchwytu przez tę aplikację.
Oznacza to, że plik może nadal tam być, gdy komenda rmdir
spróbuje usunąć folder, stąd komunikat o błędzie. Wkrótce potem wspomniana aplikacja zamknie swój uchwyt, plik zniknie, a gdy sprawdzisz folder, który plik rmdir
o nim mówił, będzie pusty.
Przynajmniej taka jest moja teoria.
Obejście proponowane przez Harry'ego Johnstona wygląda dobrze. Tylko ja wstawiłbym pauzę między komendy rmdir
. Oczywiście Windows nie ma łatwego do skryptowania polecenia “pauza” (poprawka: starożytne wersje Windows nie mają, nowsze mają - zobacz komentarze). Ale jeśli wystarczy ilość sekund, można użyć ping
, aby utworzyć pauzę:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Więc w sumie:
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}