functions/Test-EmptyFolder.ps1
|
Function Test-EmptyFolder { [CmdletBinding()] [OutputType('Boolean', 'EmptyFolder')] Param( [Parameter( Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, HelpMessage = 'Enter a file system path like C:\Scripts.' )] [ValidateNotNullOrEmpty()] [alias('PSPath')] [string[]]$Path, [Parameter(HelpMessage = 'Write a test object to the pipeline')] [switch]$PassThru ) Begin { Write-Verbose "Starting $($MyInvocation.MyCommand)" Write-Verbose "Running under PowerShell version $($PSVersionTable.PSVersion)" } #Begin Process { foreach ($item in $path) { $cPath = (Convert-Path -LiteralPath $item) Write-Verbose "Measuring $cPath on $([System.Environment]::MachineName)" if (Test-Path -LiteralPath $cPath) { $d = [System.IO.DirectoryInfo]::new($cPath) If ($PSVersionTable.PSVersion.major -gt 5 ) { #this .NET class is not available in Windows PowerShell 5.1 $opt = [System.IO.EnumerationOptions]::new() $opt.RecurseSubdirectories = $True $opt.AttributesToSkip = 'SparseFile', 'ReparsePoint' Try { $files = $d.GetFiles('*', $opt) } Catch { Write-Warning $_.exception.message } } #if newer that Windows PowerShell 5.1 else { Write-Verbose 'Using legacy code' Try { $files = $d.GetFiles('*', 'AllDirectories') } Catch { Write-Warning $_.exception.message } } If ($files.count -eq 0) { $Empty = $True } else { Write-Verbose "Found $($files.count) files" $Empty = $False } if ($PassThru) { [PSCustomObject]@{ PSTypeName = 'EmptyFolder' Path = $cPath Name = (Split-Path -Path $cPath -Leaf) IsEmpty = $Empty Computername = [System.Environment]::MachineName } } else { $Empty } } else { Write-Warning "Can't find $Path on $([System.Environment]::MachineName)" } } #foreach item } End { Write-Verbose "Ending $($MyInvocation.MyCommand)" } } |