Respuestas:
La forma más fácil que se me ocurre es con un pequeño script de PowerShell . Si está ejecutando Windows 7 ya debería tenerlo instalado, si no, visite Microsoft.com para descargarlo e instalarlo. El enlace proporciona una descripción detallada, pero la esencia de la operación se incluye aquí para su conveniencia.
Abra PowerShell e ingrese esto:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
Cambie C: \ Scripts a lo que quiera buscar, incluso puede configurarlo solo en C: \ si desea que compruebe toda la unidad.
Le dará una salida como esta (tenga en cuenta que estos son los directorios vacíos debajo de C: \ Scripts.
Nombre completo ------- C: \ Scripts \ Empty C: \ Scripts \ Carpeta vacía 2 C: \ Scripts \ Empty \ Empty Subfolder C: \ Scripts \ Nueva carpeta \ Subcarpeta vacía Tres niveles de profundidad
Si observa un poco PowerShell, estoy seguro de que podrá descubrir cómo eliminar automáticamente las carpetas vacías si lo desea (aunque lo recomiendo, por si acaso).
Editar : como Richard mencionó en los comentarios, para un directorio verdaderamente vacío use:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
?{$_.GetFileSystemInfos().Count -eq 0}
.
La siguiente es la forma más fácil que pude encontrar para lograr esto con una sola línea de código. Enumera los directorios vacíos en la ubicación actual. Si se necesita la recursión, el parámetro -Recurse
podría agregarse a la llamada a Get-ChildItem
.
Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
Versión corta con alias:
dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }
O, como una función de PowerShell parametrizada (agregué esto a mi perfil de inicio de PowerShell):
Function Get-EmptyDirectories($basedir) {
Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}
Esto se puede invocar como cualquier otra función de PowerShell, incluidas las tuberías. Por ejemplo, esta llamada eliminaría todos los directorios vacíos en el directorio temporal del sistema:
Get-EmptyDirectories $env:TMP | del
Prueba esto
Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}
El recuento no es 0, no existe en absoluto, lo que significa que el directorio está completamente vacío o contiene otras carpetas completamente vacías
Gracias, usé esto como base para mi guión. Quería eliminar carpetas vacías, pero intentar hacerlo Where-Object {$_.GetFiles().Count -eq 0}
eliminaría las carpetas que tenían subdirectorios que no estaban vacías. Terminé usando un bucle DO WHILE para eliminar una carpeta que no tenía archivos o carpetas, luego retrocedo y verifique nuevamente hasta que llegue al final del árbol.
$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)
#>