Come trovare directory vuote in Windows usando uno script Powershell


8

Quale comando usi per trovare directory vuote in Windows?

Alcune cartelle potrebbero contenere alcune cartelle nascoste come .svno .settings, ma dovrebbero comunque essere trattate come cartelle vuote.


Quale versione di Windows stai utilizzando?
Windos,

Risposte:


13

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

sto usando Windows Vista
Joshua

PowerShell per Vista può essere scaricato qui: microsoft.com/download/en/details.aspx?id=23200
Windos

7
Nota: quella pipeline troverà cartelle che non contengono file ma che contengono altre cartelle. Per avere cartelle completamente vuote, cambiare il terzo elemento della pipe in ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard,

1
@Joshua, non hai modificato "C: \ Scripts" nel punto in cui desideri cercare, quindi viene visualizzato l'errore "Impossibile trovare il percorso 'C: \ Scripts' perché non esiste." È proprio all'inizio della linea.
Windos,

1
@Joshua, hai letto il commento di Richards (terzo in questo thread) e la mia modifica alla risposta? Questo dovrebbe darti solo directory senza file e senza directory secondarie (cioè i nodi foglia)
Windos

2

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, è -Recursepossibile 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


2

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


1

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)
#>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.