Como resolver o erro “O diretório não está vazio” ao executar o comando rmdir em um script de lote?

95

Estou fazendo um script em lote e parte do script está tentando remover um diretório e todos os seus subdiretórios. Estou recebendo um erro intermitente sobre um subdiretório não estar vazio. Eu li um artigo sobre a indexação ser a culpada. Desativei o WSearch, mas acabei recebendo o erro novamente. Aqui está o comando:

rmdir /S /Q "C:\<dir>\"
Mayhem
fonte
1
Posso perguntar algumas informações sobre os tipos de arquivos sobre os quais o Windows o alerta? Para mim, isso só ocorre com arquivos PDF logo depois de movê-los / copiá-los.
Jake Stevens-Haas de

Respostas:

91

Eu experimentei os mesmos problemas que Harry Johnston mencionou. rmdir /s /qreclamaria que um diretório não estava vazio, embora /sseja para fazer o esvaziamento para você! Acho que é um bug do Windows, pessoalmente.

Minha solução alternativa é deltudo no diretório antes de excluir o próprio diretório:

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

(O 1>nuloculta a saída padrão delporque, do contrário, lista todos os arquivos que exclui.)

BoffinBrain
fonte
Eu me deparei com um cenário em que alguns subdiretórios mydirproduziram o mesmo erro "não está vazio". Então eu tive que cdentrar mydire executar o delnos arquivos em cada um desses diretórios também. No final das contas funcionou, mas se eu tivesse que repetir o processo uma terceira vez em outro subnível, me sentiria muito derrotado.
gfullam de
@gfullam Pelo que me lembro, meu método deve funcionar em subdiretórios recursivos também, para qualquer profundidade. É isso que del /sfaz.
BoffinBrain de
Usando o explorer (provavelmente também mkdir => NÃO!), Adicionando uma pasta (e mudando o nome) termine o trabalho de remoção usando apenas o rd /s /q mydircomando.
Mestre DJon
1
Ok, acho que excluir as janelas e mudar para o Linux é muito mais fácil do que essa dor :)
RajnishCoder
1
@RajnishCoder Viver com o Windows é basicamente um mundo de soluções alternativas. Esse problema específico não é nada comparado a outros problemas com o Windows 10!
BoffinBrain de
47

Estou familiarizado com este problema. A solução mais simples é repetir condicionalmente a operação. Nunca vi ele falhar duas vezes seguidas - a menos que realmente haja um arquivo aberto ou um problema de permissão, obviamente!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme
Harry Johnston
fonte
12
Santa Molly, isso não faz sentido, mas funcionou. O que #!%#@! microsoft
Sam B de
IF EXISTesconde Access is deniede outras situações. Eu adicionei algo parecido DIR c:\deletemee verificação de erros antes de tudo.
it3xl
Ter o Windows Explorer aberto em um subdiretório ou navegar de outra forma faz com que isso falhe duas vezes seguidas. Então, certifique-se de perguntar pela terceira vez (o que realmente funcionou)
Jake Stevens-Haas
Na verdade, tem ocorrido duas vezes seguidas para mim sem nada aberto ou um problema de permissões. Meu recorde é de sete vezes. Recomende a abordagem de @BoffinbraiN.
Jake Stevens-Haas
Executei apenas o primeiro comando. Em seguida, clique com o botão direito do mouse na pasta> Propriedades> Desmarque o atributo 'Somente leitura'> Aplicar. Viola !, a pasta finalmente desapareceu.
steven7mwesigwa
22

Acabei de encontrar o mesmo problema e tinha a ver com alguns arquivos sendo perdidos ou corrompidos. Para corrigir o problema, basta executar a verificação do disco:

chkdsk /F e:

Isso pode ser executado a partir da caixa da janela de pesquisa ou de um prompt do cmd. O /Fcorrige todos os problemas encontrados, como a recuperação de arquivos. Assim que terminar a execução, você pode excluir os arquivos e pastas normalmente.

jrose
fonte
Perfeito, estou tentando há meia hora
trex
Isso encontrou alguns arquivos ocultos em minha pasta, que depois fui capaz de excluir. Really desagradável 😑
Beat
19

entre no Prompt de Comando como Admin e execute

rmdir /s <FOLDER>
Adilson Cabral
fonte
3
Isso não é diferente do que o OP estava fazendo.
Harry Johnston
7

Eu tive um problema semelhante, tentei excluir uma pasta vazia através do Windows Explorer. Me mostrou o erro não vazio, então pensei em tentar via admin cmd, mas nenhuma das respostas aqui ajudou.

Depois de mover um arquivo para a pasta vazia. Consegui deletar a pasta não vazia

Grisu118
fonte
1
Por favor, escreva em um comentário.
Virb,
Interessante. Provavelmente não é relevante para o cenário dos OPs.
Harry Johnston
Santo Deus, este foi literalmente o único pensamento que funcionou de todas as outras soluções!
Seega de
3

Como @gfullam afirmou em um comentário à resposta de @BoffinbraiN, o que <dir>você está excluindo pode não ser aquele que contém os arquivos: pode haver subdiretórios <dir>que recebam uma mensagem "O diretório não está vazio" e a única solução seria itere recursivamente sobre os diretórios, excluindo manualmente todos os seus arquivos contidos ... Acabei decidindo usar uma porta de rmdo UNIX. rm.exevem com Git Bash, MinGW, Cygwin, GnuWin32 e outros. Você só precisa ter seu diretório pai em seu PATH e, em seguida, executar como faria em um sistema UNIX.

Exemplo de script em lote:

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

O que funcionou para mim é o seguinte. Parece que o comando RMDir emitirá “O diretório não está vazio” quase o tempo todo ...

: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
user7432246
fonte
2

Eu tinha "C: \ Usuários \ Nome do usuário \ OneDrive \ Fonts", que foi mklink'ed (/ D) para "C: \ Windows \ Fonts" e tive o mesmo problema. No meu caso

cd "C: \ Usuários \ Nome do usuário \ OneDrive"

Fontes rd / s

S (para confirmar a ação)

me ajudou. Espero que isso ajude você também; D

Maciej Bledkowski
fonte
2
Adicione / q para evitar a necessidade de confirmação ao executar um lote.
Jonathan Rosenne
1

Im meu caso, acabei de mover a pasta para o diretório raiz assim.

move <source directory> c:\

E então executei o comando para remover o diretório

rmdir c:\<moved directory> /s /q
Daniel Barde
fonte
2
rmdir c:\<moved directory> /s /qé a resposta correta
lalengua
1
NÃO é a resposta correta. excluir uma pasta na raiz pode causar as mesmas mensagens: a pasta não está vazia.
Gangnus
Eu sei que este é um tópico antigo. Só queria dizer que funcionou para mim ...
Manuel Rivera
1

O motivo da rd /srecusa em excluir certos arquivos é provavelmente devido aos atributos READONLY nos arquivos do diretório.

A maneira adequada de corrigir isso é certificar-se de redefinir os atributos em todos os arquivos primeiro:

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

Pode haver outros, como arquivos ocultos ou de sistema, portanto, se você quiser se proteger:

attrib -h -r -s %directory% /s /d
rd /s %directory%
Peter Hoeg
fonte
0

Semelhante à resposta de Harry Johnston, faço um loop até que funcione.

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

Às vezes, o Windows está "quebrado por design", então você precisa criar uma pasta vazia e, em seguida, espelhar a "pasta quebrada" com uma "pasta vazia" com modo de 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

Crie um diretório vazio como este:

mkdir empty

sobrescrever pasta quebrada com vazio como este:

robocopy /copyall /mir /b empty broken

e, em seguida, exclua essa pasta

rd broken /s
rd empty /s

Se isso não ajudar, tente reiniciar no "modo de recuperação com prompt de comando" segurando a tecla shift ao clicar em reiniciar e tentar executar esses comandos novamente no modo de recuperação

Kristijonas Grigorovičius
fonte
Sim, acho que o Robocopy funcionaria no cenário de OPs, porque ele repete automaticamente as operações com falha. Você provavelmente deseja especificar /W:0para evitar atrasos desnecessários. Você pode não querer /bporque isso requer privilégios administrativos. O modo de recuperação não é relevante para esta questão, porque estamos falando de um script em lote, não de alguém tentando remover manualmente um diretório.
Harry Johnston
-1

Posso pensar nas seguintes causas possíveis:

  1. existem arquivos ou subdiretórios que precisam de permissões mais altas
  2. existem arquivos em uso, não apenas pelo WSearch, mas talvez pelo seu antivírus ou qualquer outra coisa

Para 1.) você pode tentar runas /user:Administratorobter privilégios mais altos ou iniciar o arquivo em lote como administrador através do menu de contexto. Se isso não ajudar, talvez até o administrador não tenha os direitos. Em seguida, você precisa assumir a propriedade do diretório.

Para 2.) faça download do Process Explorer , clique Find/Find handle or DLL...ou pressione Ctrl+F, digite o nome do diretório e descubra quem o usa. Feche o aplicativo que usa o diretório, se possível.

Thomas Weller
fonte
As máquinas têm a conta de administrador desabilitada. Estou no grupo admin, mas não conheço uma senha de administrador. Alguma outra sugestão para contornar o problema de permissão? Alguém mencionou chamar outro programa em lote (como vba).
Mayhem de
@ Mayhem: contornar as permissões é muito difícil ... Provavelmente precisaríamos de um exploit para um bug no Windows para fazer isso sem uma senha.
Thomas Weller,