Excluir todos os arquivos de uma pasta e suas subpastas

52

Eu quero remover todos os arquivos de uma estrutura de pastas, então fico com uma estrutura de pastas vazia.

Isso pode ser alcançado em scripts em lote ou VBScript ?

Eu tentei um comando em lote muito básico, mas isso exigia que o usuário permitisse a exclusão de cada arquivo. Esta não foi uma solução adequada, pois existem muitas centenas de arquivos e isso aumentará enormemente ao longo do tempo.

O que você pode sugerir?

BobJim
fonte
Você quer dizer uma exclusão recursiva? Isso pode realmente ser feito. Algo como rd /s /q "c:\folder airá realizar uma exclusão recursiva em todos os arquivos e pastas dentroFolder A
Ramhound
Eu poderia fazer, eu não sei como script no PowerShell, mas já executei scripts do PowerShell anteriores.
BobJim
2
Agora é o momento perfeito para aprender, eu pesquisaria a sintaxe de lote e vbs para fins legados, mas investiria mais tempo na aprendizagem do PS.
precisa saber é o seguinte
Ainda não tive a chance de verificar o código, embora tenha certeza de que funcionará. Voltarei e selecionarei a resposta mais apropriada para minha consulta inicial.
precisa saber é o seguinte
Em segundo lugar, recomendo a @ BigHomie - aprendi um pouco do PowerShell e devo dizer que é bem legal - não muito difícil, uma boa arma no arsenal de qualquer programador. Eu o uso com bastante frequência agora.
19414 Ben

Respostas:

75

Isso pode ser feito usando o PowerShell :

Get-ChildItem -Path C:\Temp -Include *.* -File -Recurse | foreach { $_.Delete()}

Este comando coloca cada item filho $path, executa o método delete em cada um e é bastante rápido. A estrutura da pasta é deixada intacta.

Se você tiver arquivos sem extensão, use

Get-ChildItem -Path C:\Temp -Include * -File -Recurse | foreach { $_.Delete()}

em vez de.

Parece que o -Fileparâmetro pode ter sido adicionado após o PowerShell v2. Se for esse o caso, então

Get-ChildItem -Path C:\Temp -Include *.* -Recurse | foreach { $_.Delete()}

Deveria fazer o truque para arquivos que têm uma extensão.

Se não funcionar, verifique se você possui uma versão atualizada do Powershell

MDMoore313
fonte
1
É -Include *.*não -Include ., grande diferença! :-)
MDMoore313
Get-ChildItem -Path D: \ EmptyThisFolder -Include . -Arquivo -Recurso | foreach {$ _. Delete ()}
BobJim 25/04
Por que você está usando -Include .?? Esse é o problema.
precisa saber é o seguinte
2
Eles não podem implementar powershell --version? Eles não podem usar um número de versão com dígitos positivos? É uma loucura. Mais de 1300 upvotes para uma pergunta sobre como descobrir o número da versão de um programa?
Thomas Weller
1
@demonicdaron não deveria; A questão do OP era preservar a estrutura de pastas.
MDMoore313
25

PowerShell curto e em conjunto. Não tenho certeza com qual versão mais baixa do PS ele irá funcionar.

Remove-Item c:\Tmp\* -Recurse -Force
Evan Nadeau
fonte
2
Legal e fácil. Isso fez o truque, enquanto a resposta aceita não!
demonicdaron
Essa deve ser a resposta aceita, você pode até digitar, rm *já que não é realmente aconselhável forçar (a caixa de diálogo de confirmação tem uma opção "Sim para todos").
J Garcia
22

Você pode fazer isso com o delcomando:

dir C:\folder
del /S *

A /Sopção é excluir apenas arquivos recursivamente.

phoops
fonte
2
Isso excluirá apenas os arquivos, mas deixará as pastas?
BobJim
5
Sim. Você pode adicionar a /Popção para solicitar que você confirme cada exclusão apenas para verificar isso.
Phoops
obrigado mal tentar! espero que economize muito tempo!
BobJim
3
Sim. E para excluir arquivos ocultos e do sistema, faça attrib -s -r -h Folder\*.* /s /dantes de excluir. E para permissões, use o takeowncomando
Jet
2
E você pode usar / Q para NÃO pedir confirmação ao usar caracteres curinga.
Aylatan 25/09/2015
4

Lendo as entrelinhas da sua pergunta original, posso oferecer uma linha de código BATCH alternativa que você pode usar. O que isso fará quando executado é excluir apenas arquivos com mais de 60 dias. Dessa forma, você pode colocar isso em uma tarefa agendada e, quando executada, exclui os arquivos em excesso que você não precisa, em vez de afastar o diretório inteiro. Você pode alterar de 60 a 5 dias ou até 1 dia, se quiser. Isso não exclui pastas.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"
Travis
fonte
Obrigado pela idéia, mas atualmente acho que o processo de "esvaziamento" será concluído em um período adhoc muito não programado. Vou manter esse código para o futuro! Cheers
BobJim
O título diz "Excluir todos os arquivos de uma pasta e de suas subpastas", portanto, essa não é uma solução.
Anders Lindén
4

Usando o PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 
Gregory Suvalian
fonte
3

Use o PowerShell para excluir um único arquivo ou pasta. Antes de executar o comando Excluir no PowerShell, precisamos garantir que você esteja conectado ao servidor ou PC com uma conta que tenha acesso total aos objetos que você deseja excluir.

Com exemplo: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Usando os comunicados do PowerShell para excluir um arquivo

Remove-Item -Path "C: \ dotnet-helpers \ DummyfiletoDelete.txt"

O comando acima executará e excluirá o arquivo “DummyfiletoDelete.txt”, que aparece dentro do local “C: \ dotnet-helpers”.

Usando os comunicados do PowerShell para excluir todos os arquivos

Remove-Item -Path "C: \ dotnet-helpers *. *"

Usando os comunicados do PowerShell para excluir todos os arquivos e pastas

Remove-Item -Path "C: \ dotnet-helpers *. *" -Recurse

-recursedetalha e encontra muitos outros arquivos. O –recurseparâmetro permitirá que o PowerShell remova qualquer item filho sem pedir permissão. Além disso, o parâmetro –force pode ser adicionado para excluir arquivos ocultos ou somente leitura.

Usando o comando -Force para excluir arquivos com força

Usando o comando PowerShell para excluir todos os arquivos com força

Remove-Item -Path "C: \ dotnet-helpers *. *" -Force

thiyagu selvaraj
fonte
1

Tente isso usando o PowerShell. Neste exemplo, quero excluir todos os arquivos .class:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}
Boubakr
fonte
1
  1. No Windows Explorer, selecione o diretório raiz que contém todos os arquivos e pastas.

  2. Procurar por *

  3. Classificar por tipo (todas as pastas estarão na parte superior e todos os arquivos listados abaixo)

  4. Selecione todos os arquivos e pressione Excluir.

Isso excluirá todos os arquivos e preservará a estrutura de diretórios.

Emel
fonte
1

Exclua todos os arquivos do diretório e subdiretórios atuais, deixando a estrutura de pastas.

( /Q) é para perguntar ao usuário se ele pode excluir

Cuidado : tente sem o /Qpara garantir que você não esteja excluindo nada precioso.

del /S * /Q 
hdoghmen
fonte
1

Esta é a maneira mais fácil da IMO

Abra o PowerShell, navegue até o diretório ( cd), THEN

ls -Recurse * | rm

(Poof) tudo se foi ...

Se você deseja excluir com base em uma extensão específica

ls -Recurse *.docx | rm

ls está listando o diretório

-Recurse é uma bandeira dizendo ao PowerShell para entrar em qualquer subdiretório

* diz tudo

*.doc tudo com extensão .doc

| alimente a saída da esquerda para a direita

rm excluir

Todas as outras respostas parecem tornar isso mais confuso do que o necessário.

Kolob Canyon
fonte
0
dir C:\testx\ -Recurse -File | rd -WhatIf
What if: Performing the operation "Remove File" on target "C:\testx\x.txt".
What if: Performing the operation "Remove File" on target "C:\testx\bla\x.txt".
bertieb
fonte
-1

Como complemento para as respostas acima, na verdade não há necessidade de usar o Get-Childitem e passar o resultado para o pipeline nas respostas acima, porque a palavra-chave -Include está incluída no comando Remove-Item

Pode-se simplesmente:

Remove-Item -Include " . " "C: \ Temp" -Recurse

Sams0nT
fonte