Exclua completamente uma pasta no Windows usando a linha de comando

57

Eu preciso excluir uma pasta contendo outras pastas e arquivos dentro. Eu tentei dele rmdircomandos, mas às vezes eles falham com algumas linhas de erro:[PATH]: The directory isn't empty.

Existe alguma boa alternativa?

Francesco Zanini
fonte
Eu experimentei inconsistência em saber se o rmdir com sinalizadores apropriados remove tudo em uma árvore de diretórios (e / ou a própria árvore), e a única explicação possível que tenho é o que Harry Johnston diz.
r_alex_hall

Respostas:

15

Isso acontece muito com meus scripts de construção automatizados.

Eu acho que o motivo pode ser algum aplicativo que tenha um arquivo aberto nesse diretório com "compartilhamento excluir". Ou seja, o aplicativo permite a exclusão do arquivo (e é por isso que acho que a chamada DeleteFile não falha), mas o arquivo só desaparece depois que o aplicativo fechar o identificador.

Isso significa que o arquivo ainda pode estar lá quando o rmdircomando tenta excluir a pasta, daí a mensagem de erro. Logo depois disso, o aplicativo fechará sua alça, o arquivo desaparecerá e, quando você inspecionar a pasta para ver qual arquivo rmdirestava falando, ficará vazio.

Pelo menos essa é a minha teoria.

A solução proposta por Harry Johnston parece ser boa. Somente eu inseriria uma pausa entre os rmdircomandos. É claro que o Windows não possui um comando de "pausa" facilmente programável (correção: as versões antigas do Windows não, as mais recentes têm - veja os comentários). Mas se granularidade de segundos é suficiente, pode-se usar pingpara criar uma pausa:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

Então, no total:

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}
Paul Groke
fonte
Na minha experiência, uma pausa nunca é necessária, mas YMMV. (Claro, se realmente existe outro aplicativo em jogo é preferível para identificá-lo e explicitamente esperar por ele para sair, se possível.)
Harry Johnston
Bem ... implementei um loop de repetição de 10x com um segundo de atraso por repetição. Funciona agora. Não vou tentar remover a pausa, apenas para vê-la falhar novamente :-) Claro que isso não significa que é necessário. Apenas sendo extremamente cauteloso.
Paul Groke
2
OT: É por isso que eu odeio janelas. Tudo é tão difícil. rm -rf /directory/deve ser global em todos os sistemas operacionais.
2
Na verdade, existe um tipo de comando de "pausa"; para pausar três segundos, você pode usar isso:timeout /t 3
r_alex_hall 14/02
@r_alex_hall De fato (mas nativamente somente do Vista em diante, XP e versões anteriores não têm o pausecomando).
misha256
57

Experimentar:

rmdir /S your_directory

ou:

rmdir /S /Q your_directory 

para pular as mensagens de confirmação.

AndrewQ
fonte
11
Eu já tentei essas opções, mas como escrevi dele rmdirnão pergunto nada, elas apenas enviam algumas linhas como a da descrição.
Francesco Zanini
2
rmdir /sexcluirá tudo o que for possível excluir. Você pode ter arquivos bloqueados por um programa, arquivos somente leitura ou arquivos que você precisa de acesso administrativo para excluir. Não existe um único comando que cuide de todas essas situações para você
nvuono
Se você ainda receber mensagens de erro, tente com o PowerShell: o cmdlet Remove-Item é um pouco poderoso que o rmdir.
AndrewQ
11
rmdir / S <diretório> Está excluindo diretório e subfolhas e diretórios. Ele também pergunta: Você tem certeza? No Windows 10. Obrigado
Jasmeet 13/03/19
11
@r_alex_hall RMDIR / s realmente exclui arquivos em diretórios. Mas DEL / s excluirá apenas os arquivos e manter os diretórios, razão pela qual RMDIR é a melhor opção
JCH2k
11

Você pode ter alguns arquivos somente leitura, pode usar a opção del / F para se livrar deles usando

     del /S /F your_directory
     rmdir your_directory

Você também pode ter alguns arquivos ocultos e, se realmente tiver certeza de que deseja excluí-los, poderá fazer isso usando

     del /S /F /AH your_directory
     rmdir your_directory

Se isso ainda falhar, você não tem permissão para excluir alguns arquivos ou alguns deles ainda estão em uso.

sgmoore
fonte
Esta deve ser a resposta correta!
Jdhao
4

Eu acredito que há um bug no Windows 7 (e talvez em outras versões) que às vezes causa esse sintoma; ou pode ser um bug em software de terceiros. (Você tem o Symantec Endpoint Protection instalado por acaso?)

Enfim, eu já o encontrei com bastante frequência. Na maioria dos casos, o problema pode ser resolvido executando rd /s /qduas ou três vezes seguidas.

Se isso estiver em um arquivo em lotes, você poderá fazer algo assim:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Harry Johnston
fonte
Acordado. O uso de rd / s foo - sem a opção / q silent - excluirá todas as subpastas para você, mas você deverá responder Y ao prompt, exigindo a participação de arquivos em lotes. Menos que o ideal eu sei.
Anthony
3

Use delnos arquivos internos e rmdirremova a pasta.

Para usar o rmdirmétodo para remover todos os arquivos também, use a /Sopção antes do nome do diretório e /Qsuprima da solicitação de exclusão. Essa é a melhor maneira de fazer isso, pois você não perde nenhum arquivo. Tenha cuidado ao usar a opção / Q, pois ela não avisará sobre os atributos de arquivo oculto ou do sistema

O canadense Luke REINSTATE MONICA
fonte
2

Se você usar o nó, poderá usar a dependência rimraf assim:

execute a instalação: npm install rimraf -g

excluir pasta: rimraf SourceFolder

Isso me ajudou ao obter o erro:

os nomes dos arquivos de origem são maiores do que os suportados pelo sistema de arquivos

Dustin Spengler
fonte
0

As versões mais antigas das pastas do Windows (DOS, Windows 95/98 / ME) DELTREEsão equivalentes a RMou RMDIR. Eu uso DELTREEna minha estação de trabalho Windows 7 em arquivos em lote muito bem.

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.
Dom
fonte
0

Eu acho que você pode usá-lo assim:

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)"
Shubham Dwivedi
fonte
11
Bem-vindo ao SU! Por que eu voto negativo? 1) Formatação ruim 2) Fornece a mesma solução essencial que já foi lançada há vários anos (sempre leia as soluções postadas antes de postar uma nova!) 3) Não é adequado para a pergunta (sua solução recria a pasta excluída, que não foi solicitado).
zagrimsan