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

1

Eu tenho uma pasta (Usuários) cheia de pastas de usuários que usamos para transferência temporária entre usuários. Eu quero ser capaz de agendar um script para esvaziar o conteúdo das pastas dos usuários sem remover as pastas do usuário ou alterar as permissões.

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

del / F \ Users **. *

Mas isso não funcionou.

Por favor me ajude!

E obrigado !!

    
por protocol 03.09.2013 / 19:20

1 resposta

4

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

Aqui, tem um pouco do Powershell:

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

Isso excluirá todos os arquivos na e sob a árvore de diretórios C: \ Users, mas deixará todos os diretórios intactos.

Editar:

Que tal isso:

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

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

Editar: Desde que 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 igual a C:\> dir C:\Users no DOS, mas o Powershell negocia e retorna tudo na forma de objetos , não apenas na saída simples do console. Então, pela primeira linha de leitura

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

Isso significa que vamos passar por um loop para cada "objeto" existente em C: \ Users. Como não estamos usando o parâmetro -Recurse aqui, o Powershell só retornará a lista de diretórios de primeiro nível de C: \ Users e não irá procurar nos subdiretórios.

If($_.PSIsContainer) é uma instrução If que significa "se a propriedade" PSIsContainer "do objeto atual estiver configurada como True, que é apenas uma maneira sofisticada de dizer" se este for um diretório ", então vá para este loop if. / p>

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

Então vamos entrar no loop If 3 vezes, então cada vez será algo como isto:

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 essa linha faz é obter o conteúdo desse subdiretório, e a opção -Recurse é especificada para que seja detalhada em todos os subdiretórios de joe , kate e bill .

Em seguida, são necessários todos esses objetos-filhos e pipes para Remove-Item , e você pode pensar em Remove-Item como um apelido sofisticado para del . Exclui todas as coisas.

Faz sentido?

    
por 03.09.2013 / 20:04