Qual é a maneira mais simples de excluir com força um diretório e todos os seus subdiretórios no PowerShell? Estou usando o PowerShell V2 no Windows 7.
Aprendi com várias fontes que o comando mais óbvio Remove-Item $targetDir -Recurse -Force
, não funciona corretamente. Isso inclui uma declaração na ajuda online do PowerShell V2 (encontrada usando Get-Help Remove-Item -Examples
) que afirma:
... Como o parâmetro Recurse nesse cmdlet está com defeito, o comando usa o cmdlet Get-Childitem para obter os arquivos desejados e o operador de pipeline para passá-los ao cmdlet Remove-Item ...
Eu já vi vários exemplos que usam Get-ChildItem e o direcionam para Remove-Item , mas os exemplos geralmente removem alguns conjuntos de arquivos com base em um filtro, não em todo o diretório.
Estou procurando a maneira mais limpa de exibir um diretório inteiro, arquivos e diretórios filhos, sem gerar nenhuma mensagem de aviso do usuário usando a menor quantidade de código. Um one-liner seria bom se for fácil de entender.
fonte
RD /S /Q
rd
é um apelido paraRemove-Item
no PowerShell.cmd /c "rd /s /q"
funciona, no entanto.Respostas:
realmente funciona como anunciado aqui.
são apelidos abreviados que também funcionam.
Até onde eu entendi, o
-Recurse
parâmetro simplesmente não funciona corretamente quando você tenta excluir um conjunto de arquivos filtrados recursivamente. Por matar um único dir e tudo abaixo parece funcionar bem.fonte
cmd /c rd
conforme indicado abaixo.Eu usei:
Isso funciona para mim como um encanto (eu roubei do Ubuntu).
fonte
rm
é um alias paraRemove-Item
a configuração padrão do PowerShell. Verifique a saída deGet-Alias rm
para mais detalhes. Ele-r
está aproveitando o comportamento de correspondência parcial do PowerShell nos parâmetros. DesdeRemove-Item
tem apenas a um parâmetro que começa com um 'r',-Recurse
,-r
corresponde. Assim, a seguir tudo vai funcionar da mesma:rm -r
,rm -re
,Remove-Item -Recurse
. (Note-se que nemrm -rf
nemrm -r -f
vai funcionar, masrm -r -fo
. Vontade-rf
Jogos sem parâmetros e-f
partidas mais do que uma.)rm -rf folder
e, é claro, falhou. Inicialmente, votei negativamente na resposta (porque dizia Ubuntu). Graças ao comentário de @chwarr, tentei sem of
e ele pegou o alias em vez de rm binário. Desejo Tuan vai atualizar sua fonte (não sei se Tuan sabia que era um apelido ou realmente pensei que era o rm unix ;-)-R
vez de-r
(embora, até onde eu saiba, o PowerShell seja como o resto do Windows não faz distinção entre maiúsculas e minúsculas, portanto não deve fazer diferença), mas recebi um erro que as pastas que estou tentando excluir são não está vazio.Ao excluir arquivos recursivamente usando um simples
Remove-Item "folder" -Recurse
, às vezes vejo um erro intermitente:[folder] cannot be removed because it is not empty.
Esta resposta tenta impedir esse erro excluindo individualmente os arquivos.
Um detalhe importante é a classificação de todos os itens
pspath -Descending
para que as folhas sejam excluídas antes das raízes. A classificação é feita nopspath
parâmetro, pois tem mais chances de trabalhar para outros fornecedores que não o sistema de arquivos. O-Include
parâmetro é apenas uma conveniência se você deseja filtrar os itens a serem excluídos.Ele é dividido em duas funções, pois acho útil ver o que estou prestes a excluir executando
fonte
remove-item -recurse
Powershell v5, portanto, essa solução é a melhor para mim.... trabalhou para mim
fonte
Tente este exemplo. Se o diretório não existir, nenhum erro será gerado. Você pode precisar do PowerShell v3.0.
fonte
Use o comando DOS da velha escola:
fonte
/q
(modo silencioso, não pergunte se está OK para remover uma árvore de diretórios com / S) também.Por alguma razão, a resposta de John Rees às vezes não funcionou no meu caso. Mas isso me levou na seguinte direção. Primeiro, tento excluir o diretório recursivamente com a opção buggy -recurse. Depois, desço para todos os subdiretórios restantes e apago todos os arquivos.
fonte
Para evitar os erros "O diretório não está vazio" da resposta aceita, basta usar o bom e antigo comando do DOS, conforme sugerido anteriormente. A sintaxe completa do PS pronta para copiar e colar é:
fonte
Adotei outra abordagem inspirada em @ john-rees acima - especialmente quando sua abordagem começou a falhar para mim em algum momento. Recursalize basicamente a subárvore e classifique os arquivos pelo tamanho do caminho - exclua do maior para o menor
Em relação à magia -LiteralPath, aqui está outra pegadinha que pode estar atingindo você: https://superuser.com/q/212808
fonte
OU
Se você tem um diretório enorme, o que eu costumo fazer é
Execute isso em outro terminal do PowerShell e ele irá parar quando terminar.
fonte
A exclusão de uma árvore de pastas inteira às vezes funciona e às vezes falha com erros de "Diretório não vazio". Subseqüentemente, tentar verificar se a pasta ainda existe pode resultar em erros "Acesso negado" ou "Acesso não autorizado". Não sei por que isso acontece, embora algumas informações possam ser obtidas com essa postagem do StackOverflow .
Consegui solucionar esses problemas especificando a ordem em que os itens da pasta são excluídos e adicionando atrasos. O seguinte funciona bem para mim:
Um artigo do Microsoft TechNet Usando propriedades calculadas no PowerShell foi útil para obter uma lista de subpastas classificadas por profundidade.
Problemas semelhantes de confiabilidade com RD / S / Q podem ser resolvidos executando DEL / F / S / Q antes de RD / S / Q e executando o RD uma segunda vez, se necessário - idealmente com uma pausa no meio (por exemplo, usando ping como mostrado abaixo).
fonte
Realmente simples:
fonte
Outro truque útil:
Se você encontrar muitos arquivos com a mesma convenção de nome ou com um nome semelhante (como arquivo mac com nome de prefixo de ponto ... esse famoso arquivo pulltion), poderá removê-los facilmente com uma única linha do powershell, como segue:
Essa linha removerá todos os arquivos com um ponto no início do nome dentro do diretório atual e todos os arquivos com as mesmas circunstâncias em outras pastas dentro desse diretório. Esteja ciente disso ao usá-lo. : D
fonte
rm -rf .*
? Não tenho o PowerShell para testar, mas acho que funcionará.Para excluir o conteúdo completo, incluindo a estrutura de pastas, use
O
-recurse
item adicionadoremove-item
garante que os avisos interativos sejam desativados.fonte
Escreveu o acima para limpar alguns arquivos de log sem excluir o diretório pai e isso funciona perfeitamente!
fonte
fonte