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

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


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

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.


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


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


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

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

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


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

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%

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
)

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


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.


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,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.