Anytime you’re doing cleanup on a share or a local directory, it’s always a good idea to prep and find empty folders using Powershell. A good use case is if you’re going to permanently archive a folder, and you want to do some cleanup to remove the excess baggage of folders that no longer have anything inside them, this would be an excellent tool to make that happen.
This Powershell script uses Get-ChildItem under the hood and also supports the Depth, Recurse and Path Parameters to give you a bit more flexibility on your queries. It also allows you to use UNC paths as well so you can easily use this for network drives if that’s what you choose to audit.
How To Find Empty Folders Using Powershell
Let’s move on to the script on how to find empty folders using Powershell.
Function Get-EmptyDirectory { <# .SYNOPSIS Get empty directories using underlying Get-ChildItem cmdlet .NOTES Name: Get-EmptyDirectory Author: theSysadminChannel Version: 1.0 DateCreated: 2021-Oct-2 .LINK https://thesysadminchannel.com/find-empty-folders-powershell/ - .EXAMPLE Get-EmptyDirectory -Path \\Server\Share\Folder -Depth 2 #> [CmdletBinding()] param( [Parameter( Mandatory = $true, Position = 0 )] [string] $Path, [Parameter( Mandatory = $false, Position = 1 )] [switch] $Recurse, [Parameter( Mandatory = $false, Position = 2 )] [ValidateRange(1,15)] [int] $Depth ) BEGIN {} PROCESS { try { $ItemParams = @{ Path = $Path Directory = $true } if ($PSBoundParameters.ContainsKey('Recurse')) { $ItemParams.Add('Recurse',$true) } if ($PSBoundParameters.ContainsKey('Depth')) { $ItemParams.Add('Depth',$Depth) } $FolderList = Get-ChildItem @ItemParams | select -ExpandProperty FullName foreach ($Folder in $FolderList) { if (-not (Get-ChildItem -Path $Folder)) { [PSCustomObject]@{ EmtpyDirectory = $true Path = $Folder } } else { [PSCustomObject]@{ EmtpyDirectory = $false Path = $Folder } } } } catch { Write-Error $_.Exception.Message } } END {} }
Conclusion
If you’re looking for a quick and easy way to find empty folders using Powershell, this script will definitely do the job and do it well. The great thing about it is that it is extremely portable so you can copy and paste this script onto another machine and run it locally if you prefer not to have it ran remotely.
For more content like this, be sure to check out our real world Powershell scripts just like this to make sure your sysadmin journey a little easier.
I’d suggest changing the GCI -path parameter to -LiteralPath. Without it, you’ll get false positives if any foldernames have regex characters in them, [] brackets being a good example.