Devo eliminare una cartella contenente altre cartelle e file all'interno. Ho provato del
e rmdir
comandi ma a volte falliscono con alcune righe di errore:[PATH]: The directory isn't empty.
C'è qualche buona alternativa?
Devo eliminare una cartella contenente altre cartelle e file all'interno. Ho provato del
e rmdir
comandi ma a volte falliscono con alcune righe di errore:[PATH]: The directory isn't empty.
C'è qualche buona alternativa?
Risposte:
Questo mi succede molto con i miei script di build automatizzati.
Immagino che il motivo potrebbe essere una qualche applicazione che ha un file aperto in quella directory con "share delete". Vale a dire che l'applicazione consente di eliminare il file (motivo per cui immagino che la chiamata a DeleteFile non fallisca), ma il file scompare solo dopo che l'applicazione ha chiuso e viene gestita.
Ciò significa che il file potrebbe essere ancora lì quando il rmdir
comando tenta di eliminare la cartella, quindi il messaggio di errore. Poco dopo, detta applicazione chiuderà il suo handle, il file scomparirà e quando ispezionerai la cartella per vedere di quale file rmdir
parlava sarà vuoto.
Almeno questa è la mia teoria.
La soluzione proposta da Harry Johnston sembra buona. Solo vorrei inserire una pausa tra i rmdir
comandi. Ovviamente Windows non ha un comando di "pausa" facilmente gestibile tramite script (correzione: le versioni di Windows antiche no, quelle più recenti hanno - vedi commenti). Ma se la granularità dei secondi è sufficiente, è possibile utilizzare 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}
rm -rf /directory/
dovrebbe essere globale su tutti i sistemi operativi.
timeout /t 3
pause
comando).
Provare:
rmdir /S your_directory
o:
rmdir /S /Q your_directory
per saltare i messaggi di conferma.
del
e rmdir
non chiedo nulla, inviano solo alcune righe come quella nella descrizione.
rmdir /s
eliminerà tutto ciò che è possibile eliminare. È possibile che siano presenti file bloccati da un programma, file di sola lettura o file che è necessario disporre dell'accesso amministrativo per l'eliminazione. Non esiste un singolo comando che si occuperebbe di tutte quelle situazioni per te
Potresti avere alcuni file di sola lettura, puoi usare l'opzione del / F per sbarazzartene usando
del /S /F your_directory
rmdir your_directory
Potresti anche avere alcuni file nascosti e se sei davvero sicuro di volerli eliminare, puoi farlo usando
del /S /F /AH your_directory
rmdir your_directory
Se il problema persiste, o non si dispone dell'autorizzazione per eliminare alcuni file o alcuni dei file sono ancora in uso.
Credo che ci sia un bug in Windows 7 (e forse altre versioni) che a volte causa questo sintomo; o potrebbe essere un bug nel software di terze parti. (Hai Symantec Endpoint Protection installato per caso?)
Comunque, l'ho incontrato abbastanza spesso. Nella maggior parte dei casi, il problema può essere risolto eseguendo rd /s /q
due o tre volte di seguito.
Se questo è in un file batch, puoi fare qualcosa del genere:
rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Utilizzare del
sui file all'interno, quindi rmdir
per rimuovere la cartella.
Per utilizzare il rmdir
metodo per rimuovere anche tutti i file, utilizzare l' /S
opzione prima del nome della directory e /Q
per eliminare la richiesta di eliminazione. Questo è il modo migliore per farlo, poiché non perdi alcun file. Fai attenzione utilizzando l'opzione / Q, poiché non ti avviserà degli attributi di file nascosti o di sistema
Cartella versioni precedenti di Windows (DOS, Windows 95/98 / ME), DELTREE
è l'equivalente di RM
o RMDIR
. Uso bene la DELTREE
mia workstation Windows 7 in file batch.
Deletes a directory and all the subdirectories and files in it.
To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]
/Y Suppresses prompting to confirm you want to delete
the subdirectory.
[drive:]path Specifies the name of the directory you want to delete.
Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Penso che puoi usarlo in questo modo:
msg*your file is going to delete
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\"
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"