Exclua apenas os arquivos que deixam subpastas vazias usando o powershell

2

C: \ Temp \ ifc tem cerca de 297 pastas dentro dele, com cerca de 4,1 milhões de arquivos espalhados entre eles.

Usando um script que encontrei em outro lugar neste site, escrevi o seguinte para excluir todos os 'arquivos' com mais de uma hora.

$TargetFolder = “C:\Temp\ifc”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

O problema que estou tendo é que ele está excluindo as subpastas também (se essas pastas acabarem sem arquivos nelas).

O que posso adicionar a isso para deixar a estrutura de pastas no lugar?

Muito obrigado.

    
por Gareth Doherty 06.03.2016 / 01:56

1 resposta

4

Você pode adicionar uma cláusula where adicional para ignorar pastas como esta:

Where-Object{!($_.PSIsContainer)}

No trecho de código acima;

  • ! significa não,
  • $_ significa o valor atual do objeto no canal,
  • PSIsContainer é uma propriedade do objeto atual que retorna true ou false dependendo se é uma pasta ou não.

Portanto, !($_.PSIsContainer) significa que o valor atual do objeto no pipe não é uma pasta,
que é avaliado por Where-Object{}

Então o seu script seria assim:

$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -Recurse | Where-Object{!($_.PSIsContainer)} | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

Outra abordagem é ignorar as pastas na chamada para Get-ChildItem usando o parâmetro -File como este:

$TargetFolder = “C:\Temp\ifc\”
$NumberRange = "-1"
Get-ChildItem $TargetFolder -File -Recurse | Where {$_.lastwritetime -lt (Get-Date).AddHours($NumberRange)} | Remove-Item

Essa abordagem tem a vantagem de retornar os objetos de arquivo em um ponto mais rápido no ciclo de execução e tornar a linha de comando mais curta. Dependendo do número de objetos no caminho, isso também pode ter uma melhoria de velocidade mensurável.

    
por 06.03.2016 / 02:22