ProductivityTools.RemoveEmptyDirectories.psm1
# This is a private helper function function RemoveThumbsDb { [CmdletBinding(SupportsShouldProcess=$true)] param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [System.IO.DirectoryInfo[]]$Directories ) PROCESS { Write-Verbose "Searching for directories containing only Thumbs.db..." # The input $Directories should already be sorted by path length descending. foreach ($directory in $Directories) { # Get all items in the current directory. -Force to see hidden items. $items = @(Get-ChildItem -LiteralPath $directory.FullName -Force) # Check if the directory contains exactly one item, and that item is a file named "Thumbs.db" if ($items.Count -eq 1 -and $items[0].Name -eq 'Thumbs.db' -and -not $items[0].PSIsContainer) { $thumbDbPath = $items[0].FullName if ($PSCmdlet.ShouldProcess($thumbDbPath, "Remove file (makes parent directory empty)")) { Write-Verbose "Removing '$thumbDbPath' from directory '$($directory.FullName)'" Remove-Item -LiteralPath $thumbDbPath -Force } } } } } function Remove-EmptyDirectories { [CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')] param( [Parameter(Position=0, HelpMessage="The path to search for empty directories. Defaults to the current directory.")] [string]$Path, [Parameter(HelpMessage="Recursively search subdirectories.")] [switch]$Recurse, [Parameter(HelpMessage="First remove Thumbs.db from directories that only contain that file.")] [switch]$FirstRemoveThumbDbFromEmptyDirectories ) $searchPath = if ([string]::IsNullOrEmpty($Path)) { $PWD.Path } else { $Path } Write-Verbose "Starting search in path: $searchPath" # Get all directories. We add -Force to include hidden directories. # We sort by the length of the FullName descending. This ensures we process the deepest directories first. $allDirectories = Get-ChildItem -Path $searchPath -Recurse:$Recurse -Directory -Force | Sort-Object { $_.FullName.Length } -Descending if ($FirstRemoveThumbDbFromEmptyDirectories) { RemoveThumbsDb -Directories $allDirectories } Write-Verbose "Searching for empty directories..." foreach ($directory in $allDirectories) { # After potentially removing Thumbs.db, we check if the directory is empty. if ((Get-ChildItem -LiteralPath $directory.FullName -Force).Count -eq 0) { if ($PSCmdlet.ShouldProcess($directory.FullName, "Remove empty directory")) { Write-Verbose "Removing empty directory '$($directory.FullName)'" Remove-Item -LiteralPath $directory.FullName -Force } } } } Export-ModuleMember -Function Remove-EmptyDirectories |