Cómo encontrar directorios vacíos en Windows usando un script de Powershell

8

¿Qué comando utilizas para encontrar directorios vacíos en Windows?

Algunas carpetas pueden contener algunas carpetas ocultas como .svno .settings, pero aún deben tratarse como carpetas vacías.

Joshua
fuente
¿Qué versión de Windows tienes?
Windos

Respuestas:

13

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
Windos
fuente
estoy usando Windows Vista
Joshua
PowerShell para Vista se puede descargar aquí: microsoft.com/download/en/details.aspx?id=23200
Windos
77
Nota: esa tubería encontrará carpetas que no contienen archivos pero que contienen otras carpetas. Para tener carpetas completamente vacías, cambie el tercer elemento de la tubería a ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard
1
@Joshua, no cambiaste "C: \ Scripts" a donde deseas buscar, por lo tanto, obtienes el error "No se puede encontrar la ruta 'C: \ Scripts' porque no existe". Está justo al comienzo de la línea.
Windos
1
@Joshua, ¿has leído el comentario de Richards (tercero en este hilo) y mi edición de la respuesta? Eso solo debería darle directorios sin archivos y sin directorios secundarios (es decir, los nodos hoja)
Windos
2

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 -Recursepodrí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

eso
fuente
2

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

Tomer Salakoff
fuente
1

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)
#>
Miguel
fuente