Réponses:
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
?{$_.GetFileSystemInfos().Count -eq 0}
.
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 -Recurse
pourrait ê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
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
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)
#>