So finden Sie leere Verzeichnisse in Windows mithilfe eines Powershell-Skripts

8

Mit welchem ​​Befehl suchen Sie leere Verzeichnisse in Windows?

Einige Ordner enthalten möglicherweise versteckte Ordner wie .svnoder .settings, sollten jedoch weiterhin als leere Ordner behandelt werden.

Joshua
quelle
Welche Windows-Version verwenden Sie?
Windos

Antworten:

13

Am einfachsten kann ich mir ein kleines PowerShell-Skript vorstellen . Wenn Sie Windows 7 ausführen, sollte es bereits installiert sein. Wenn nicht, besuchen Sie Microsoft.com, um es herunterzuladen und zu installieren. Der Link enthält eine detaillierte Beschreibung, aber der Überblick über die Operation ist hier zur Vereinfachung enthalten.

Öffnen Sie PowerShell und geben Sie Folgendes ein:

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

Ändern Sie C: \ Scripts in das, was Sie durchsuchen möchten. Sie können es sogar auf C: \ setzen, wenn das gesamte Laufwerk überprüft werden soll.

Sie erhalten eine Ausgabe wie diese (beachten Sie, dass dies die leeren Verzeichnisse unter C: \ Scripts sind.

Vollständiger Name
------- 
C: \ Scripts \ Empty 
C: \ Skripte \ Leerer Ordner 2 
C: \ Scripts \ Empty \ Empty Subfolder 
C: \ Skripte \ Neuer Ordner \ Leerer Unterordner Drei Ebenen tief

Wenn Sie sich PowerShell ein wenig ansehen, werden Sie sicher herausfinden können, wie Sie leere Ordner automatisch löschen können, wenn Sie möchten (obwohl ich es nur für den Fall empfehle).

Bearbeiten : Wie Richard in den Kommentaren erwähnt hat, verwenden Sie für ein wirklich leeres Verzeichnis:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
Windos
quelle
Ich benutze Windows Vista
Joshua
PowerShell für Vista kann hier heruntergeladen werden: microsoft.com/download/en/details.aspx?id=23200
Windos
7
Hinweis: Diese Pipeline findet Ordner, die keine Dateien enthalten, aber andere Ordner enthalten. Um vollständig leere Ordner zu haben, ändern Sie das dritte Element der Pipe in ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard
1
@Joshua, Sie haben "C: \ Scripts" nicht an der Stelle geändert, an der Sie suchen möchten. Daher wird die Fehlermeldung "Pfad 'C: \ Scripts' kann nicht gefunden werden, da er nicht vorhanden ist" angezeigt. Es ist genau am Anfang der Linie.
Windos
1
@ Joshua, hast du Richards Kommentar (dritter in diesem Thread) und meine Bearbeitung der Antwort gelesen? Das sollte Ihnen nur Verzeichnisse ohne Dateien und ohne
untergeordnete
2

Das Folgende ist der einfachste Weg, dies mit einer einzigen Codezeile zu erreichen. Es listet die leeren Verzeichnisse am aktuellen Speicherort auf. Wenn eine Rekursion erforderlich ist, kann der Parameter -Recursezum Aufruf von hinzugefügt werden Get-ChildItem.

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

Kurzversion mit Aliasnamen:

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

Oder als parametrisierte PowerShell-Funktion (ich habe dies meinem PowerShell-Startprofil hinzugefügt):

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

Dies kann dann wie jede andere PowerShell-Funktion einschließlich Rohrleitungen aufgerufen werden. Dieser Aufruf würde beispielsweise alle leeren Verzeichnisse im temporären Systemverzeichnis löschen:

Get-EmptyDirectories $env:TMP | del

eso
quelle
2

Versuche dies

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

Die Anzahl ist nicht 0, sie existiert überhaupt nicht, was bedeutet, dass das Verzeichnis vollständig leer ist oder andere vollständig leere Ordner enthält

Tomer Salakoff
quelle
1

Danke, ich habe dies als Grundlage für mein Skript verwendet. Ich wollte leere Ordner löschen, aber Where-Object {$_.GetFiles().Count -eq 0}wenn ich das versuchte, löschte ich Ordner mit Unterverzeichnissen, die nicht leer waren. Am Ende habe ich eine DO WHILE-Schleife verwendet, um einen Ordner zu entfernen, der keine Dateien oder Ordner hatte. Dann habe ich eine Schleife zurückgesetzt und erneut überprüft, bis das Ende des Baums erreicht ist.

$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
quelle