2014-04-08 14 views
32

Sto facendo uno script batch e parte dello script sta cercando di rimuovere una directory e tutte le sue sottodirectory. Sto ottenendo un errore intermittente su una sottodirectory non vuota. Ho letto un articolo sull'indicizzazione come colpevole. Ho disattivato WSearch ma alla fine ho ricevuto nuovamente l'errore.Batch - Getting "La directory non è vuota" su comando rmdir

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

risposta

0

mi vengono in mente le seguenti cause possibili:

  1. ci sono file o sottodirectory che hanno bisogno di permessi più elevati
  2. ci sono file in uso, non solo da WSearch, ma forse per il vostro virus scanner o qualsiasi altra cosa

Per 1.) si può provare runas /user:Administrator per ottenere privilegi più elevati o avviare il file batch come amministratore tramite il contesto menu. 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... oppure premere Ctrl + F , digitare il nome della directory e scoprire chi lo usa. Chiudere l'applicazione che utilizza la directory, se possibile.

+0

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

+0

@Mayhem: aggirare le autorizzazioni è piuttosto difficile ... Probabilmente avremmo bisogno di un exploit per un bug in Windows per farlo senza una password. –

19

Ho familiarità con questo problema. La soluzione più semplice consiste nel ripetere condizionatamente l'operazione. Non l'ho mai visto fallire due volte di fila - a meno che non ci sia effettivamente un file aperto o un problema di permessi, ovviamente!

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

Funziona! Perché funziona? Questo non dovrebbe funzionare. –

+2

Holy Molly, questo non ha ancora senso ha funzionato. Che cosa è #!% # @! microsoft –

+0

LOL a questi commenti, f ****** Microsoft –

30

Ho riscontrato gli stessi problemi menzionati da Harry Johnston. rmdir /s /q si lamenterebbe che una directory non era vuota anche se /s ha lo scopo di fare lo svuotamento per te! Penso che sia un bug in Windows, personalmente.

La mia soluzione è del tutto nella directory prima di eliminare la directory stessa: (. La 1>nul nasconde lo standard output di del perché altrimenti, elenca ogni singolo file cancella)

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

+0

Mi sono imbattuto in uno scenario in cui alcune sottodirectory all'interno di 'mydir' hanno prodotto lo stesso errore" non vuoto ". Quindi ho dovuto 'cd' in' mydir' ed eseguito 'del' sui file in ognuna 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

+0

@gfullam Per quanto ricordo, il mio metodo dovrebbe funzionare anche su subdirectory ricorsive, per qualsiasi profondità. Questo è ciò che 'del/s' fa. – BoffinbraiN

0

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

move <source directory> c:\ 

E poi eseguito il comando per rimuovere la directory

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

'rmdir c: \ /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

1

Come @gfullam dichiarato in un commento a @ di BoffinbraiN risposta, il <dir> si sta cancellando per sé potrebbe non essere quella che contiene i file: potrebbero esserci sottodirectory in <dir> che ottengono un messaggio "La directory non è vuota" e l'unica soluzione sarebbe quella di scorrere iterativamente in modo ricorsivo sulle directory, eliminando manualmente tutti i file contenenti ... Ho deciso di utilizzare una porta di rm da UNIX. rm.exe viene fornito con Git Bash, MinGW, Cygwin, GnuWin32 e altri. Devi solo avere la sua directory madre nel PATH e poi eseguire come faresti in un sistema UNIX.

batch script di esempio:

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

Quello che ha funzionato per me è il seguente. Mi appare come il comando rmdir emetterà “La directory non è vuota” quasi tutto il tempo ...

: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 
10

Ho appena incontrato lo stesso problema e aveva a che fare con alcuni file che vengono persi o danneggiati. Per correggere il problema, eseguire il disco di controllo:

chkdsk /F e: 

Questo può essere eseguito dalla casella di ricerca o da un prompt cmd. Lo /F corregge tutti i problemi che trova, come il recupero dei file. Una volta che questa operazione è terminata, puoi cancellare i file e le cartelle come al solito.

+0

risolto il mio problema –

+0

Perfetto, stavo provando da mezz'ora – trex

+0

Grazie amico, perfetto !!! –

0

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

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