Questo mi succede spesso con i miei script di compilazione automatica.
Immagino che la ragione potrebbe essere qualche applicazione che ha un file aperto in quella directory con “share delete”. Vale a dire che l'applicazione permette la cancellazione del file (ecco perché immagino che la chiamata DeleteFile non fallisca), ma il file scomparirà solo dopo che tale applicazione avrà chiuso la sua gestione.
Ciò significa che il file potrebbe essere ancora lì quando il comando rmdir
cerca di cancellare la cartella, da cui il messaggio di errore. Poco dopo, detta applicazione chiuderà il suo handle, il file scomparirà, e quando si controlla la cartella per vedere quale file rmdir
ne parlava sarà vuoto.
Almeno questa è la mia teoria.
La soluzione proposta da Harry Johnston sembra buona. Solo che inserirei una pausa tra i comandi di rmdir
. Naturalmente Windows non ha un comando “pausa” facilmente scrivibile (correzione: le vecchie versioni di Windows non lo fanno, le nuove lo fanno - vedi commenti). Ma se la granularità dei secondi è sufficiente si può usare ping
per creare una pausa:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Quindi in totale:
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}