functions/Get-Recyclebin.ps1

Function Get-RecycleBinSize {
    [cmdletbinding()]
    [OutputType('RecycleBinInfo')]
    [alias('rbsz')]
    Param(
        [Parameter(
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            HelpMessage = 'Specify the name of a remote computer. You must have admin rights. The default is the localhost.'
        )]
        [ValidateNotNullOrEmpty()]
        [string[]]$ComputerName = $env:COMPUTERNAME,

        [parameter(HelpMessage = 'Specify an alternate credential.')]
        [ValidateNotNullOrEmpty()]
        [PSCredential]$Credential
    )

    Begin {
        $PSDefaultParameterValues['_verbose:Command'] = $MyInvocation.MyCommand
        $PSDefaultParameterValues['_verbose:block'] = 'Begin'
        _verbose -message $strings.Starting
        if ($MyInvocation.CommandOrigin -eq 'Runspace') {
            #Hide this metadata when the command is called from another command
            _verbose -message ($strings.PSVersion -f $PSVersionTable.PSVersion)
            _verbose -message ($strings.UsingHost -f $host.Name)
            _verbose -message ($strings.UsingModule -f $DiskReportingModule)
        }

        #define a script block to run remotely
        $getSB = {
            Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType=3' | ForEach-Object {
                $rbSize = Get-ChildItem -Path "$($_.DeviceID)\`$Recycle.Bin" -Force -File -Recurse -ErrorAction SilentlyContinue |
                Measure-Object -Property Length -Sum
                #return a hashtable
                @{
                    ComputerName   = $env:COMPUTERNAME
                    Drive          = $_.DeviceID
                    RecycleBinSize = $rbSize.Sum
                }
            }
        }
        $PSBoundParameters.Add('ScriptBlock', $getSB)
        $PSBoundParameters.Add('HideComputerName', $true)
        If ($Credential) {
            _verbose ($strings.RunAs -f $Credential.UserName)
        }
    } #begin

    Process {
        $PSDefaultParameterValues['_verbose:block'] = 'Process'

        foreach ($Computer in $ComputerName) {
            _verbose ($strings.RBSize -f $ComputerName.ToUpper())
            If (-Not ($PSBoundParameters.ContainsKey('ComputerName'))) {
                $PSBoundParameters['ComputerName'] = $ComputerName
            }
            else {
                $PSBoundParameters['ComputerName'] = $Computer
            }
            $PSBoundParameters | Out-String | Write-Debug
            $r = Invoke-Command @PSBoundParameters
            if ($r) {
                $r | ForEach-Object {
                    #create a custom object
                    [PSCustomObject]@{
                        PSTypeName     = 'RecycleBinInfo'
                        ComputerName   = $_.ComputerName
                        Drive          = $_.Drive
                        RecycleBinSize = $_.RecycleBinSize
                    }
                }
            }
            else {
                Write-Warning ($strings.DiskFailure -f $ComputerName.ToUpper(), $_.exception.message)
            }
        } #foreach Computer
    } #process

    End {
        $PSDefaultParameterValues['_verbose:block'] = 'End'
        $PSDefaultParameterValues['_verbose:Command'] = $MyInvocation.MyCommand
        _verbose $strings.Ending
    } #end

} #close Get-RecycleBinSize