Script para excluir pastas e subpastas de uma pasta específica cheia de subpastas

Script para excluir pastas e subpastas de uma pasta específica cheia de subpastas

Tenho uma pasta (Usuários) cheia de pastas de usuários que usamos para transferência temporária entre usuários. Quero poder agendar um script para esvaziar o conteúdo das pastas de usuários sem remover as pastas de usuários ou alterar permissões.

Existe uma maneira de fazer isso através de um arquivo em lote? Eu pensei originalmente que poderia usar algo como:

del /F \Usuários**.*

Mas isso não funcionou.

Por favor ajude!

E obrigado!!

Responder1

Você está no Server 2012... você tem cerca de 0 motivos para usar o lote.

Aqui, tenha um Powershell:

Foreach($_ In Get-ChildItem C:\Users -Recurse) 
{ 
    If(!$_.PSIsContainer) { Remove-Item $_.Fullname } 
}

Isso excluirá todos os arquivos dentro e abaixo da árvore de diretórios C:\Users, mas deixará todos os diretórios intactos.

Editar:

Que tal agora:

Foreach($_ In Get-ChildItem C:\Users)
{
    If($_.PSIsContainer)
    {
        Get-ChildItem $_.FullName -Recurse | Remove-Item
    }   
}

Então agora o que estamos fazendo é obter uma lista de diretórios de "primeiro nível" em C:\Users e, em seguida, limpar recursivamente o conteúdo de cada uma dessas pastas, de modo que, no final, as únicas coisas que restarão serão C :\Users e o primeiro nível de subdiretórios abaixo dele.

Editar:Como você mencionou que gostaria de entender isso melhor, mas é novo no Powershell, explicarei o script acima com um pouco mais de detalhes.

Get-ChildItem C:\Usersé basicamente como C:\> dir C:\Usersno DOS, mas o Powershell lida e retorna tudo na forma deobjetos, não apenas uma simples saída do console. Então, pela leitura da primeira linha

Foreach($_ In Get-ChildItem C:\Users)

Significa que vamos percorrer um loop para cada "objeto" que existe em C:\Users. Já que estamosnãousando o -Recurseparâmetro aqui, o Powershell retornará apenas a listagem de diretório de primeiro nível de C:\Users e não se aprofundará nos subdiretórios.

If($_.PSIsContainer)é uma instrução If que significa "se a propriedade" PSIsContainer "do objeto atual estiver definida como True, o que é apenas uma maneira elegante de dizer" se este for um diretório ", entre neste loop if.

Portanto, para cada subdiretório em C:\Users, entraremos no loop If. Então, digamos que C:\Usershaja três subdiretórios: C:\Users\joe, C:\Users\kate, e C:\Users\bill. Esses subdiretórios podem conter qualquer número de arquivos e subdiretórios.

Então entraremos no loop If 3 vezes, então cada vez será algo assim:

Get-ChildItem <C:\Users\joe> -Recurse | Remove-Item

Get-ChildItem <C:\Users\kate> -Recurse | Remove-Item

Get-ChildItem <C:\Users\bill> -Recurse | Remove-Item

O que esta linha faz é obter o conteúdo desse subdiretório, e a -Recurseopção é especificada para que ela faça uma busca detalhada em todos os subdiretórios de joe, kate, e bill.

Então, ele pega todos esses objetos filhos etuboseles para Remove-Item, e você pode pensar nisso Remove-Itemcomo um apelido sofisticado para del. Ele exclui todas as coisas.

Faz sentido?

informação relacionada