Antworten:
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
?{$_.GetFileSystemInfos().Count -eq 0}
.
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 -Recurse
zum 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
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
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)
#>