Jak znaleźć puste katalogi w systemie Windows za pomocą skryptu Powershell

8

Jakiego polecenia używasz do znajdowania pustych katalogów w systemie Windows?

Niektóre foldery mogą zawierać ukryte foldery, takie jak .svnlub .settings, ale nadal powinny być traktowane jako puste foldery.

Jozuego
źródło
Z jakiej wersji systemu Windows korzystasz?
Windos,

Odpowiedzi:

12

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
Windos
źródło
używam systemu Windows Vista
Joshua
Program PowerShell dla systemu Vista można pobrać tutaj: microsoft.com/download/en/details.aspx?id=23200
Windos
7
Uwaga: ten potok znajdzie foldery, które nie zawierają plików, ale zawierają inne foldery. Aby mieć całkowicie puste foldery, zmień trzeci element potoku na ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard,
1
@Joshua, nie zmieniłeś „C: \ Scripts” na miejsce, w którym chcesz szukać, dlatego pojawia się błąd „Nie można znaleźć ścieżki„ C: \ Scripts ”, ponieważ ona nie istnieje.” To jest na początku linii.
Windos,
1
@Joshua, czy przeczytałeś komentarz Richardsa (trzeci w tym wątku) i moją edycję odpowiedzi? To powinno tylko daje katalogów bez plików i katalogów nie dziecko (tj węzłów leaf)
Windos
2

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 -Recursemoż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

eso
źródło
1

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)
#>
Michael
źródło
1

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

Tomer Salakoff
źródło