Elimina completamente una cartella in Windows utilizzando la riga di comando


57

Devo eliminare una cartella contenente altre cartelle e file all'interno. Ho provato dele rmdircomandi ma a volte falliscono con alcune righe di errore:[PATH]: The directory isn't empty.

C'è qualche buona alternativa?


Ho riscontrato incoerenza nel fatto che rmdir con flag appropriati rimuova tutto in un albero di directory (e / o l'albero stesso) e l'unica possibile spiegazione che ho è ciò che dice Harry Johnston.
r_alex_hall,

Risposte:


15

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 rmdircomando 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 rmdirparlava sarà vuoto.

Almeno questa è la mia teoria.

La soluzione proposta da Harry Johnston sembra buona. Solo vorrei inserire una pausa tra i rmdircomandi. 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 pingper 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}

Nella mia esperienza, non è mai necessaria una pausa, ma YMMV. (Naturalmente se c'è davvero un'altra applicazione in gioco, è preferibile identificarla e attendere esplicitamente che esca se possibile.)
Harry Johnston,

Bene ... Ho implementato un loop di tentativi 10x con un ritardo di un secondo per tentativo. Funziona ora Non proverò a rimuovere la pausa, ma solo per vederla fallire di nuovo :-) Naturalmente ciò non significa che sia necessario. Solo essere molto cauto.
Paul Groke,

2
OT: Ecco perché odio Windows. È tutto così difficile. rm -rf /directory/dovrebbe essere globale su tutti i sistemi operativi.

2
In realtà esiste un comando "pausa" di sorta; per mettere in pausa tre secondi puoi usare questo:timeout /t 3
r_alex_hall

@r_alex_hall In effetti (ma nativamente solo da Vista in poi, XP e precedenti non hanno il pausecomando).
misha256,

57

Provare:

rmdir /S your_directory

o:

rmdir /S /Q your_directory 

per saltare i messaggi di conferma.


1
Ho già provato queste opzioni ma, come ho scritto dele rmdirnon chiedo nulla, inviano solo alcune righe come quella nella descrizione.
Francesco Zanini,

2
rmdir /seliminerà 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
nvuono il

Se ricevi ancora messaggi di errore, prova con PowerShell: il cmdlet Remove-Item è un po 'potente di rmdir.
AndrewQ,

1
rmdir / S <directory> Sta eliminando directory e subfoler e directory. Inoltre chiede Sei sicuro. Su Windows 10. Grazie
Jasmeet,

1
@r_alex_hall RMDIR / s effettivamente elimina i file nelle directory. DEL / s eliminerà solo i file e manterrà le directory, motivo per cui RMDIR è l'opzione migliore
JCH2k

11

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.


Questa dovrebbe essere la risposta corretta!
jdhao,

4

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 /qdue 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

Concordato. L'uso di rd / s foo, ovvero senza l'opzione / q silent, eliminerà tutte le sottocartelle, ma è necessario rispondere a Y al prompt, quindi è necessario ricevere file batch. Meno dell'ideale che conosco.
Anthony,

3

Utilizzare delsui file all'interno, quindi rmdirper rimuovere la cartella.

Per utilizzare il rmdirmetodo per rimuovere anche tutti i file, utilizzare l' /Sopzione prima del nome della directory e /Qper 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


2

Se usi il nodo puoi usare la dipendenza rimraf in questo modo:

eseguire l'installazione: npm install rimraf -g

elimina cartella: rimraf SourceFolder

Questo mi ha aiutato quando ho ricevuto l'errore:

i nomi dei file di origine sono più grandi di quelli supportati dal file system


0

Cartella versioni precedenti di Windows (DOS, Windows 95/98 / ME), DELTREEè l'equivalente di RMo RMDIR. Uso bene la DELTREEmia 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.

0

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)"

1
Benvenuto in SU! Perché ho effettuato il downvoting? 1) Scarsa formattazione 2) Fornisce la stessa soluzione essenziale già pubblicata diversi anni fa (leggi sempre le soluzioni pubblicate prima di pubblicarne una nuova!) 3) Non è adatta alla domanda (la tua soluzione ricrea la cartella eliminata, che non è stato chiesto).
Zagrimsan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.