Como encontrar diretórios vazios no Windows usando um Script Powershell

8

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

Algumas pastas podem conter algumas pastas ocultas, como .svn ou .settings , mas elas ainda devem ser tratadas como pastas vazias.

    
por Joshua 10.08.2011 / 07:32

3 respostas

10

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

Abra o PowerShell e insira isto:

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

Mude C: \ Scripts para o que você quiser pesquisar, você pode até mesmo configurá-lo para apenas C: \ se você quiser verificar toda a unidade.

Ele lhe dará uma saída como essa (note que estes são os diretórios vazios abaixo de C: \ Scripts.

FullName
------- 
C:\Scripts\Empty 
C:\Scripts\Empty Folder 2 
C:\Scripts\Empty\Empty Subfolder 
C:\Scripts\New Folder\Empty Subfolder Three Levels Deep

Se você olhar no PowerShell um pouco, tenho certeza de que será capaz de descobrir como excluir automaticamente as pastas vazias, se quiser (embora eu recomende contra, apenas no caso.)

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

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
    
por 10.08.2011 / 07:49
2

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

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

Versão resumida com aliases:

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

Ou como uma função do PowerShell com parâmetros (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, esta chamada excluiria todos os diretórios vazios no diretório temporário do sistema:

Get-EmptyDirectories $env:TMP | del

    
por 12.03.2018 / 12:00
1

Obrigado, usei isso como base para meu roteiro. Eu queria excluir pastas vazias, mas tentar fazer Where-Object {$_.GetFiles().Count -eq 0} excluiria pastas que continham subdiretórios que não estavam vazios. Eu acabei usando um loop DO WHILE para remover uma pasta que não tinha arquivos ou pastas, em seguida, fazer o loop de volta e verificar 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)
#>
    
por 10.05.2013 / 01:10