Das passiert mir sehr oft mit meinen automatisierten Build-Skripten.
Ich vermute, der Grund dafür könnte eine Anwendung sein, die in diesem Verzeichnis eine Datei mit “Freigabe löschen” geöffnet hat. D.h. die Anwendung erlaubt zwar das Löschen der Datei (weshalb ich glaube, dass der DeleteFile-Aufruf nicht fehlschlägt), aber die Datei verschwindet erst, nachdem die besagte Anwendung ihr Handle geschlossen hat.
Das bedeutet, dass die Datei möglicherweise noch vorhanden ist, wenn der Befehl rmdir
versucht, den Ordner zu löschen, daher die Fehlermeldung. Bald darauf schließt das besagte Programm sein Handle, die Datei verschwindet, und wenn Sie den Ordner inspizieren, um zu sehen, von welcher Datei rmdir
gesprochen hat, ist er leer.
Zumindest ist das meine Theorie.
Die von Harry Johnston vorgeschlagene Abhilfe sieht gut aus. Nur würde ich zwischen den Befehlen rmdir
eine Pause einfügen. Natürlich hat Windows keinen leicht skriptfähigen “Pause”-Befehl (Korrektur: alte Windows-Versionen haben keinen, neuere haben einen - siehe Kommentare). Aber wenn die Granularität von Sekunden ausreicht, kann man ping
verwenden, um eine Pause zu erzeugen:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Also insgesamt:
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}