Odpowiedzi:
Najprościej jest myśleć o małym skrypcie PowerShell . Jeśli używasz systemu Windows 7, powinieneś go już zainstalować, jeśli nie, odwiedź Microsoft.com, aby go pobrać i zainstalować. Link zawiera szczegółowy opis, ale dla wygody podany jest tutaj pierwszy etap operacji.
Otwórz PowerShell i wpisz:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
Zmień C: \ Skrypty na cokolwiek, co chcesz przeszukać, możesz nawet ustawić tylko C: \, jeśli chcesz, aby sprawdzał cały dysk.
To da ci wynik taki jak ten (pamiętaj, że są to puste katalogi poniżej C: \ Scripts.
Pełna nazwa ------- C: \ Scripts \ Empty C: \ Scripts \ Pusty folder 2 C: \ Scripts \ Empty \ Empty Subfolder C: \ Scripts \ New Folder \ Empty Subfolder Three Levels Deep
Jeśli spojrzysz trochę na PowerShell, jestem pewien, że będziesz w stanie dowiedzieć się, jak automatycznie usuwać puste foldery, jeśli chcesz (choć na wszelki wypadek zalecam).
Edycja : Jak wspomniał Richard w komentarzach, do naprawdę pustego katalogu użyj:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
?{$_.GetFileSystemInfos().Count -eq 0}
.
Oto najprostszy sposób, w jaki udało mi się to osiągnąć za pomocą jednego wiersza kodu. Wyświetla listę pustych katalogów w bieżącej lokalizacji. Jeśli potrzebna jest rekurencja, parametr -Recurse
można dodać do wywołania do Get-ChildItem
.
Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
Krótka wersja z aliasami:
dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }
Lub jako sparametryzowana funkcja PowerShell (dodałem to do mojego profilu startowego PowerShell):
Function Get-EmptyDirectories($basedir) {
Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}
Można to następnie wywołać jak każdą inną funkcję PowerShell, w tym potokowanie. Na przykład to wywołanie spowoduje usunięcie wszystkich pustych katalogów w systemowym katalogu tymczasowym:
Get-EmptyDirectories $env:TMP | del
Dzięki, wykorzystałem to jako podstawę mojego skryptu. Chciałem usunąć puste foldery, ale próba Where-Object {$_.GetFiles().Count -eq 0}
usunięcia folderów z podkatalogami, które nie były puste. Skończyło się na użyciu pętli DO WHILE, aby usunąć folder, który nie miał plików ani folderów, a następnie zapętlić i sprawdzić ponownie, aż dotrze do końca drzewa.
$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)
#>
Spróbuj tego
Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}
Liczba nie jest równa 0, w ogóle nie istnieje, co oznacza, że katalog jest całkowicie pusty lub zawiera inne całkowicie puste foldery