Risposte:
Il modo più semplice a cui riesco a pensare è con un piccolo script di PowerShell . Se stai utilizzando Windows 7, dovresti averlo già installato, altrimenti visita Microsoft.com per scaricarlo e installarlo. Il collegamento fornisce una descrizione dettagliata, ma il jist dell'operazione è incluso qui per comodità.
Apri PowerShell e inserisci questo:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
Cambia C: \ Scripts in qualunque cosa tu voglia cercare, puoi anche impostarlo su C: \ se vuoi che controlli l'intero disco.
Ti darà un output in questo modo (nota che queste sono le directory vuote sotto C: \ Scripts.
Nome e cognome ------- C: \ Scripts \ Vuoto C: \ Scripts \ Empty Folder 2 C: \ Scripts \ Empty \ Empty Sottocartella C: \ Script \ Nuova cartella \ Sottocartella vuota Tre livelli profondi
Se guardi un po 'PowerShell sono sicuro che sarai in grado di capire come eliminare automaticamente le cartelle vuote se lo desideri (anche se lo sconsiglio, per ogni evenienza).
Modifica : come Richard ha menzionato nei commenti, per una directory veramente vuota usare:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
?{$_.GetFileSystemInfos().Count -eq 0}
.
Di seguito è il modo più semplice che ho trovato per ottenere questo risultato con una singola riga di codice. Elenca le directory vuote nella posizione corrente. Se è necessaria la ricorsione, è -Recurse
possibile aggiungere il parametro alla chiamata a Get-ChildItem
.
Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
Versione breve con alias:
dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }
Oppure, come funzione PowerShell con parametri (l'ho aggiunto al mio profilo di avvio di PowerShell):
Function Get-EmptyDirectories($basedir) {
Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}
Questo può quindi essere invocato come qualsiasi altra funzione di PowerShell, incluso il piping. Ad esempio, questa chiamata eliminerebbe tutte le directory vuote nella directory temp di sistema:
Get-EmptyDirectories $env:TMP | del
Prova questo
Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}
Il conteggio non è 0, non esiste affatto nel senso che la directory è completamente vuota o contiene altre cartelle completamente vuote
Grazie, l'ho usato come base per la mia sceneggiatura. Volevo eliminare le cartelle vuote, ma provare a farlo Where-Object {$_.GetFiles().Count -eq 0}
avrebbe eliminato le cartelle con sottodirectory che non erano vuote. Ho finito per usare un ciclo DO WHILE per rimuovere una cartella che non aveva file o cartelle, quindi tornare indietro e ricontrollare fino a raggiungere la fine dell'albero.
$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)
#>