Respostas:
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
?{$_.GetFileSystemInfos().Count -eq 0}
.
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 -Recurse
poderá 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
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
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)
#>