Como faço para excluir as árvores de diretório via arquivo em lotes no Windows 7?

36

Quero excluir todo o conteúdo de uma pasta especificada no Windows 7 por meio de arquivo em lote. Meu problema é que 'del' ou 'apagar' exclui apenas os arquivos, não as pastas e 'rmdir' ou 'rd' sempre exclui a pasta especificada com seu conteúdo, mas eu quero excluir apenas o conteúdo, não a própria pasta . Eu tentei o comando ' rmdir /S /Q "C:\Share\*"', que me deu um erro de sintaxe.

Qual é a maneira correta de fazer isso?

Estou trabalhando no Windows 7 Professional de 64 bits e tenho permissões de administrador.

Michael K
fonte

Respostas:

36

Seu arquivo em lotes precisará executar dois comandos, um para limpar os arquivos e outro para remover os diretórios filhos. Eu assumi que o diretório que você deseja remover éC:\Share\

O arquivo em lotes deve se parecer com isso:

del /s /f /q c:\share\*.*
for /f %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

del /s /f /q procurará recursivamente na árvore de diretórios, excluindo arquivos (mesmo arquivos somente leitura) sem solicitar confirmação.

A segunda linha percorre todos os subdiretórios (que agora devem estar vazios) e os remove.

Com exceção de excluir a pasta inteira e recriá-la (o que não acho que você queira fazer devido a permissões?), Essa deve ser a maneira mais fácil de limpar a pasta.

Windos
fonte
Se eu fizer uma pequena correção aqui "para / f %% f" -> "para / f% f", funcionará bem :) Muito obrigado.
Michael K
6
delnão é necessário. rd/s/qexcluirá os arquivos e subpastas.
grawity
1
@rawraw o delexiste principalmente para arquivos na pasta raiz, mas pode remover a opção de recursão.
Windos
5
@MichaelK, %% f é para uso em arquivos em lote,% f para quando é um único comando direto para a linha de comando.
Windos
1
Se qualquer um dos nomes de subdiretórios contiver espaços, você poderá adicionar "delims =" para processá-los corretamente (para / f "delims =" %% f em ...): consulte stackoverflow.com/q/5553040/64918
goldPseudo
27
rmdir /s/q C:\Share

Você recebe um "erro de sintaxe" porque rmdiraceita apenas nomes completos, não curingas. (Em cmd.exe, a expansão de curinga é deixada para os programas individuais; nem todos eles fazem.)

Se você tiver muitos diretórios começando com Share..., use um forloop.

for /d %f in (C:\Share*) do rmdir /s/q "%f"
gravidade
fonte
3
Não quero excluir a pasta de compartilhamento.
Michael K
12

Tente isso em um prompt de comando:

rd /s/q "C:\Share"
Chau Chee Yang
fonte
2
Isso também removeu a pasta pai, não o conteúdo da pasta.
Teoman shipahi
2

Sobre o quê ?

rmdir /S /Q "target"
mkdir "target

EDIT: é claro que esta solução é aplicável apenas quando você pode tolerar uma ausência momentânea de pasta.

Vasilly.Prokopyev
fonte
Isso excluiria a pasta original.
Michael K
@MichaelK Minha tarefa foi capaz de tolerar uma ausência momentânea de pasta, então fui com esta solução. Eu pensei que é mais simples e mais legível do que for /fem casos semelhantes aos meus. Só queria compartilhar
Vasilly.Prokopyev
2
for /f "delims=" %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

Isso não funciona se os subdiretórios contiverem outros diretórios que contêm espaços.

Para fazer isso funcionar, eu precisava citar a sequência final, como esta

para / f "delims =" %% f em ('dir / ad / bc: \ share \') faça rd / s / q "c: \ share \ %% f"

Aparentemente, isso faz com que o comando funcione na cadeia de caracteres citada, em vez de apenas na própria cadeia de caracteres.

Jim JR Harris
fonte
0

Eu tentaria isso na pasta em que todas as subpastas devem ser excluídas, mas a raiz (e os arquivos na raiz) permanecem como estão: para / D% v em (*) faça rd / s / q% v

para / D corresponde a diretórios e rd / s / q exclui cada um de cada vez

Otto Hänninen
fonte
0

simplesmente:

rmdir / s / q "caminho"

mkdir "caminho"

eli
fonte
1
Esta é uma duplicata desta resposta .
Eu digo Restabelecer Monica