Como encontrar diretórios vazios no Windows usando um script do PowerShell

8

Qual comando você usa para encontrar diretórios vazios no Windows?

Algumas pastas podem conter pastas ocultas como .svnou .settings, mas ainda devem ser tratadas como pastas vazias.

Joshua
fonte
Qual versão do Windows você está executando?
Windos

Respostas:

13

A maneira mais fácil de pensar é com um pequeno script do PowerShell . Se você estiver executando o Windows 7, já deve instalá-lo; caso contrário, visite o site Microsoft.com para fazer o download e instalá-lo. O link fornece uma descrição detalhada, mas o resumo da operação está incluído aqui para sua conveniência.

Abra o PowerShell e digite o seguinte:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName

Altere C: \ Scripts para o que você deseja pesquisar, você pode até defini-lo como C: \ se desejar verificar a unidade inteira.

Ele fornecerá uma saída como esta (observe que estes são os diretórios vazios abaixo de C: \ Scripts.

Nome completo
------- 
C: \ Scripts \ Vazio 
C: \ Scripts \ Pasta vazia 2 
Subpasta C: \ Scripts \ Empty \ Empty 
C: \ Scripts \ Nova pasta \ Subpasta vazia com três níveis de profundidade

Se você olhar um pouco para o PowerShell, tenho certeza de que será capaz de descobrir como excluir pastas vazias automaticamente, se quiser (embora eu recomendo, por precaução).

Edit : Como Richard mencionou nos comentários, para um diretório verdadeiramente vazio, use:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
Windos
fonte
Estou usando o Windows Vista
Joshua
O PowerShell para Vista pode ser baixado aqui: microsoft.com/download/en/details.aspx?id=23200
Windos
7
Nota: esse pipeline encontrará pastas que não contêm arquivos, mas contêm outras pastas. Para ter pastas completamente vazias, altere o terceiro elemento do pipe para ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard
11
@ Josué, você não alterou "C: \ Scripts" para onde deseja pesquisar, daí o erro "Não é possível encontrar o caminho 'C: \ Scripts' porque ele não existe." É bem no início da linha.
Windos
11
@ Josué, você leu o comentário de Richards (terceiro nesta discussão) e minha edição para a resposta? Isso só deve dar-lhe diretórios com nenhum arquivo e nenhuma criança diretórios (ou seja, os nós folha)
Windos
2

A seguir, é a maneira mais fácil de encontrar para conseguir isso com uma única linha de código. Ele lista os diretórios vazios no local atual. Se for necessária recursão, o parâmetro -Recursepoderá ser adicionado à chamada para Get-ChildItem.

Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }

Versão curta com aliases:

dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }

Ou, como uma função parametrizada do PowerShell (eu adicionei isso ao meu perfil de inicialização do PowerShell):

Function Get-EmptyDirectories($basedir) { 
    Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}

Isso pode ser chamado como qualquer outra função do PowerShell, incluindo a tubulação. Por exemplo, essa chamada excluiria todos os diretórios vazios no diretório temporário do sistema:

Get-EmptyDirectories $env:TMP | del

eso
fonte
2

Tente isto

Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}

A contagem não é 0, não existe, o que significa que o diretório está completamente vazio ou contém outras pastas completamente vazias

Tomer Salakoff
fonte
1

Obrigado, usei isso como base para o meu script. Eu queria excluir pastas vazias, mas tentar Where-Object {$_.GetFiles().Count -eq 0}excluir pastas que tivessem subdiretórios que não estavam vazios. Acabei usando um loop DO WHILE para remover uma pasta que não tinha arquivos ou pastas, em seguida, retorne e verifique novamente até chegar ao final da árvore.

$Datefn=Get-Date -format M.d.yyyy_HH.mm.ss
#Set The File Name for the log file
$DelFileName = $Datefn
#Set The File Ext for the log file
$DelFileExt = " - Old Files" + ".log"
#Set The File Name With Ext for the log file
$DelFileName = $DelFileName + $DelFileExt
#Set Log Path
$LogPath = [Environment]::GetFolderPath("Desktop")
$Path = 'Q:\'
$NumDays = 365
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-$NumDays) -and $_.psiscontainer -eq $false} |
    ForEach-Object  {
        $properties = @{`
            Path = $_.Directory`
            Name = $_.Name
            DateModified = $_.LastWriteTime
            Size = $_.Length / 1GB  }
    New-Object PSObject -Property $properties | select Path,Name,DateModified, Size
    } |
    Out-File "$LogPath\$DelFileName"
<#
#Removes the files found
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-365) -and $_.psiscontainer -eq $false} | Remove-Item -Recurse -Force
#Removes empty folders
DO {
$a = (Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Select-Object Fullname
$a
(Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Remove-Item -Force
}
WHILE ($a -ne $null)
#>
Michael
fonte