Come risolvere l'errore "La directory non è vuota" quando si esegue il comando rmdir in uno script batch?


92

Sto creando uno script batch e parte dello script sta cercando di rimuovere una directory e tutte le sue sottodirectory. Ricevo un errore intermittente su una sottodirectory non vuota. Ho letto un articolo sull'indicizzazione come colpevole. Ho disabilitato WSearch ma alla fine ho ricevuto nuovamente l'errore. Ecco il comando:

rmdir /S /Q "C:\<dir>\"

Posso chiedere alcune informazioni sul tipo di file di cui Windows ti avvisa? Per me, questo si verifica solo con i file PDF subito dopo averli spostati / copiati.
Jake Stevens-Haas

Risposte:


88

Ho riscontrato gli stessi problemi menzionati da Harry Johnston. rmdir /s /qlamenterei che una directory non era vuota anche se /sè pensata per fare lo svuotamento per te! Penso che sia un bug in Windows, personalmente.

La mia soluzione alternativa è a deltutto nella directory prima di eliminare la directory stessa:

del /f /s /q mydir 1>nul
rmdir /s /q mydir

( 1>nulNasconde lo standard output di delperché altrimenti elenca ogni singolo file che elimina.)


Mi sono imbattuto in uno scenario in cui alcune sottodirectory all'interno hanno mydirprodotto lo stesso errore "non vuoto". Quindi ho dovuto cdinserire mydired eseguire anche deli file in ciascuna di quelle directory. Alla fine ha funzionato, ma se avessi dovuto ripetere il processo una terza volta in un altro sottolivello, mi sarei sentito piuttosto sconfitto.
gfullam

@gfullam Per quanto ricordo, il mio metodo dovrebbe funzionare anche su sottodirectory ricorsive, per qualsiasi profondità. Ecco cosa del /sfa.
BoffinBrain

Utilizzando explorer (probabilmente anche mkdir => NO!), Aggiungendo una cartella (e cambiando il nome) finisci il lavoro di rimozione usando solo il rd /s /q mydircomando.
Master DJ il

1
Ok, penso che eliminare le finestre e passare a Linux sia molto più facile di questo dolore :)
RajnishCoder

1
@RajnishCoder Vivere con Windows è fondamentalmente un mondo di soluzioni alternative. Questo particolare problema non è niente rispetto ad altri problemi con Windows 10!
BoffinBrain

47

Ho familiarità con questo problema. La soluzione più semplice è ripetere l'operazione in modo condizionale. Non l'ho mai visto fallire due volte di seguito, a meno che non ci sia effettivamente un file aperto o un problema di autorizzazioni, ovviamente!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
Holy Molly, questo non ha senso eppure ha funzionato. Cosa diavolo #!% # @! microsoft
Sam B

IF EXISTpelli Access is deniede altre situazioni. Ho aggiunto qualcosa di simile DIR c:\deletemee il controllo degli errori prima di tutto.
it3xl

Avere Windows Explorer aperto in una sottodirectory o navigare in altro modo fa sì che l'operazione fallisca due volte di seguito. Quindi assicurati di chiederlo una terza volta (che in realtà ha funzionato)
Jake Stevens-Haas

In realtà è successo due volte di seguito per me senza nulla di aperto o un problema di autorizzazioni. Il mio record è sette volte. Consiglia l'approccio di @ BoffinbraiN.
Jake Stevens-Haas

Ho eseguito solo il primo comando. Quindi fai clic con il pulsante destro del mouse sulla cartella> Proprietà> Deseleziona l'attributo "Sola lettura"> Applica. Viola !, la cartella finalmente è scomparsa.
steven7mwesigwa

21

entrare nel prompt dei comandi come amministratore ed eseguire

rmdir /s <FOLDER>

2
Questo non è diverso da ciò che stava facendo l'OP.
Harry Johnston

20

Ho appena riscontrato lo stesso problema e aveva a che fare con alcuni file persi o danneggiati. Per correggere il problema, esegui il controllo del disco:

chkdsk /F e:

Questo può essere eseguito dalla casella di ricerca delle finestre o da un prompt di cmd. La /Ffissa eventuali problemi rilevati, come recuperare i file. Al termine dell'esecuzione, puoi eliminare i file e le cartelle come al solito.


Perfetto, ci stavo provando da mezz'ora
trex

Questo ha trovato alcuni file nascosti nella mia cartella, che poi sono stato in grado di eliminare. Davvero brutto 😑
Batti il

7

Ho avuto un problema simile, ho provato a eliminare una cartella vuota tramite Windows Explorer. Mi ha mostrato l'errore non vuoto, quindi ho pensato di provarlo tramite admin cmd, ma nessuna delle risposte qui ha aiutato.

Dopo aver spostato un file nella cartella vuota. Sono stato in grado di eliminare la cartella non vuota


1
Per favore scrivilo nel commento.
Virb

Interessante. Probabilmente non è rilevante per lo scenario dei PO, però.
Harry Johnston

Santo cielo, questo era letteralmente l'unico pensiero che ha funzionato di tutte queste altre soluzioni!
Seega

3

Come ha affermato @gfullam in un commento alla risposta di @ BoffinbraiN, quella <dir>che stai eliminando potrebbe non essere quella che contiene i file: potrebbero esserci delle sottodirectory <dir>che ricevono un messaggio "La directory non è vuota" e l'unica soluzione sarebbe quella di iterare ricorsivamente sulle directory, eliminando manualmente tutti i file che li contengono ... Alla fine ho deciso di utilizzare un port di rmda UNIX. rm.exeviene fornito con Git Bash, MinGW, Cygwin, GnuWin32 e altri. Hai solo bisogno di avere la sua directory principale nel tuo PATH e quindi eseguire come faresti in un sistema UNIX.

Esempio di script batch:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

Quello che ha funzionato per me è il seguente. Mi sembra che il comando RMDir emetta quasi sempre "La directory non è vuota" ...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

Avevo "C: \ Users \ User Name \ OneDrive \ Fonts", che era collegato con mklink (/ D) a "C: \ Windows \ Fonts", e ho avuto lo stesso problema. Nel mio caso

cd "C: \ Users \ Nome utente \ OneDrive"

Caratteri rd / s

Y (per confermare l'azione)

mi ha aiutato. Spero che ti aiuti anche tu; D.


2
Aggiungere / q per evitare la necessità di conferma durante l'esecuzione di un batch.
Jonathan Rosenne

1

Nel mio caso, ho appena spostato la cartella nella directory principale in questo modo.

move <source directory> c:\

E poi ha eseguito il comando per rimuovere la directory

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /qè la risposta corretta
lalengua

1
NON è la risposta corretta. l'eliminazione di una cartella nella radice può causare gli stessi messaggi: la cartella non è vuota.
Gangnus

So che questo è un vecchio thread. Volevo solo dire che ha funzionato per me ...
Manuel Rivera

1

Il motivo per cui si rd /srifiuta di eliminare determinati file è molto probabilmente dovuto agli attributi di file READONLY sui file nella directory.

Il modo corretto per risolvere questo problema è assicurarsi di ripristinare prima gli attributi su tutti i file:

attrib -r %directory% /s /d
rd /s %directory%

Potrebbero esserci altri file nascosti o di sistema, quindi se vuoi giocare sul sicuro:

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

Simile alla risposta di Harry Johnston, faccio il loop finché non funziona.

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

Windows a volte è "rotto in base alla progettazione", quindi è necessario creare una cartella vuota e quindi eseguire il mirroring della "cartella danneggiata" con una "cartella vuota" con modalità di backup.

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

Crea una directory vuota in questo modo:

mkdir empty

sovrascrivere la cartella rotta con vuoto in questo modo:

robocopy /copyall /mir /b empty broken

e quindi elimina quella cartella

rd broken /s
rd empty /s

Se questo non aiuta, prova a riavviare in "modalità di ripristino con prompt dei comandi" tenendo premuto MAIUSC quando fai clic su Riavvia e prova a eseguire nuovamente questi comandi in modalità di ripristino


Sì, penso che Robocopy funzionerebbe nello scenario OP, perché ritenta automaticamente le operazioni non riuscite. Probabilmente vorrai specificare /W:0per evitare ritardi non necessari. Potresti non volerlo /bperché ciò richiede privilegi amministrativi. La modalità di ripristino non è rilevante per questa domanda, perché stiamo parlando di uno script batch, non di qualcuno che tenta manualmente di rimuovere una directory.
Harry Johnston,

-1

Posso pensare alle seguenti possibili cause:

  1. ci sono file o sottodirectory che richiedono autorizzazioni più elevate
  2. ci sono file in uso, non solo da WSearch, ma forse dal tuo antivirus o da qualsiasi altra cosa

Per 1.) puoi provare runas /user:Administrator a ottenere privilegi più elevati o avviare il file batch come amministratore tramite il menu contestuale. Se ciò non aiuta, forse anche l'amministratore non ha i diritti. Quindi è necessario assumere la proprietà della directory.

Per 2.) scarica Process Explorer , clicca Find/Find handle or DLL...o premi Ctrl+F, digita il nome della directory e scopri chi la usa. Chiudere l'applicazione che utilizza la directory, se possibile.


Le macchine hanno l'account amministratore disabilitato. Sono nel gruppo admin ma non sono a conoscenza di una password amministratore. Qualche altro suggerimento per aggirare il problema dei permessi? Qualcuno ha menzionato la chiamata a un altro programma da batch (come vba).
Mayhem

@ Mayhem: aggirare i permessi è piuttosto difficile ... Probabilmente avremmo bisogno di un exploit per un bug in Windows per farlo senza una password.
Thomas Weller
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.