Comment trouver des répertoires vides dans Windows à l'aide d'un script Powershell

8

Quelle commande utilisez-vous pour rechercher des répertoires vides dans Windows?

Certains dossiers peuvent contenir des dossiers cachés comme .svnou .settings, mais ils doivent toujours être traités comme des dossiers vides.

Joshua
la source
Quelle version de Windows utilisez-vous?
Windos

Réponses:

13

La façon la plus simple à laquelle je peux penser est avec un petit script PowerShell . Si vous exécutez Windows 7, vous devriez déjà l'avoir installé, sinon visitez Microsoft.com pour le télécharger et l'installer. Le lien fournit une description détaillée mais le résumé de l'opération est inclus ici pour votre commodité.

Ouvrez PowerShell et entrez ceci:

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

Remplacez C: \ Scripts par ce que vous souhaitez rechercher, vous pouvez même le définir sur C: \ uniquement si vous souhaitez qu'il vérifie l'intégralité du lecteur.

Il vous donnera une sortie comme celle-ci (notez que ce sont les répertoires vides sous C: \ Scripts.

Nom complet
------- 
C: \ Scripts \ Vide 
C: \ Scripts \ Dossier vide 2 
C: \ Scripts \ Empty \ Empty Subfolder 
C: \ Scripts \ Nouveau dossier \ Sous-dossier vide trois niveaux en profondeur

Si vous examinez un peu PowerShell, je suis sûr que vous serez en mesure de savoir comment supprimer automatiquement les dossiers vides si vous le souhaitez (bien que je le déconseille, au cas où.)

Edit : Comme Richard l'a mentionné dans les commentaires, pour un répertoire vraiment vide, utilisez:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
Windos
la source
utilise Windows Vista
Joshua
PowerShell pour Vista peut être téléchargé ici: microsoft.com/download/en/details.aspx?id=23200
Windos
7
Remarque: ce pipeline trouvera des dossiers qui ne contiennent aucun fichier mais contiennent d'autres dossiers. Pour que les dossiers soient complètement vides, remplacez le troisième élément du tuyau par ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard
1
@Joshua, vous n'avez pas modifié "C: \ Scripts" à l'endroit où vous souhaitez rechercher, d'où le message d'erreur "Impossible de trouver le chemin" C: \ Scripts "car il n'existe pas." C'est juste au début de la ligne.
Windos
1
@ Joshua, avez-vous lu le commentaire de Richards (le troisième dans ce fil) et ma modification de la réponse? Cela ne devrait vous donner que des répertoires sans fichiers et sans répertoires enfants (c'est-à-dire les nœuds feuilles)
Windos
2

Ce qui suit est le moyen le plus simple que j'ai pu trouver pour y parvenir avec une seule ligne de code. Il répertorie les répertoires vides à l'emplacement actuel. Si une récursivité est nécessaire, le paramètre -Recursepourrait être ajouté à l'appel à Get-ChildItem.

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

Version courte avec alias:

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

Ou, en tant que fonction PowerShell paramétrée (j'ai ajouté cela à mon profil de démarrage PowerShell):

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

Cela peut ensuite être appelé comme n'importe quelle autre fonction PowerShell, y compris la tuyauterie. Par exemple, cet appel supprimerait tous les répertoires vides du répertoire temporaire du système:

Get-EmptyDirectories $env:TMP | del

eso
la source
2

Essaye ça

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

Le nombre n'est pas 0, il n'existe pas du tout, ce qui signifie que le répertoire est complètement vide ou contient d'autres dossiers complètement vides

Tomer Salakoff
la source
1

Merci, j'ai utilisé cela comme base pour mon script. Je voulais supprimer des dossiers vides, mais essayer de le faire Where-Object {$_.GetFiles().Count -eq 0}supprimerait les dossiers qui avaient des sous-répertoires qui n'étaient pas vides. J'ai fini par utiliser une boucle DO WHILE pour supprimer un dossier qui n'avait aucun fichier ou dossier, puis boucler et vérifier à nouveau jusqu'à ce qu'il atteigne la fin de l'arborescence.

$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
la source