# encoding: ascii
# api: powershell
# title: Recycle Bin object
# description: Correctly works with reparse points
# version: 0.1
# type: function
# author: Robespierre
# license: CC0
# function: Calculate-Items
# x-poshcode-id: 5267
# x-archived: 2017-05-25T20:12:20
# x-published: 2017-06-28T11:42:00
#
# Usage:
# $RecycleBin.Items()
# $RecycleBin.Count()
# $RecycleBin.Clear()
#
$method = @{}
$method['clear'] = {
	$this.Items() | foreach -Process {
		# for the first we must remove all Junction-points
		if ($_.IsLink) { (gi $_.Path).Delete() } # directly (1)
		ls $_.Path -Recurse -Force -Directory | foreach {
			$d_item = gi -LiteralPath $_.FullName
			if ($d_item.Attributes -match 'ReparsePoint') { $d_item.Delete() } # and recursively (2)
		}
		ri $_.Path -Recurse -Force -Confirm:$false # and now the actual cleanup (3)
	}
} # /method.clear
$method['count'] = {
	Set-Variable -Name links,files,folders,size -Value 0 -Option AllScope
	function Calculate-Items ($ItemsList)
	{
		function count ($folder, $list)
		{
			if (-not $list) { $list = Get-Item "$($folder)\*" }
			$list | foreach {
				if ($_.Attributes -match 'ReparsePoint') { ++$links }
				elseif ($_.Attributes -notmatch 'Directory') { ++$files;  $size += $_.Length }
				else { ++$folders; count -folder $_.FullName } # recursively call
			}
		}
		count -list $ItemsList # initial call
	} # gci w/o links
	$upper_items_list = @()
	$this.Items() | foreach -Process { $upper_items_list += gi -LiteralPath $_.Path }
	if ($upper_items_list) { Calculate-Items -ItemsList $upper_items_list }
	return New-Object -TypeName psobject -Property @{
			Links = $links; Files = $files; Folders = $folders; Length = $size
	}
} # /method.count
$bin = (New-Object -ComObject 'Shell.Application').Namespace(0xA)
$bin | Add-Member -MemberType 'ScriptMethod' -Name 'Clear' -Value $method.clear
$bin | Add-Member -MemberType 'ScriptMethod' -Name 'Count' -Value $method.count
New-Variable -Name RecycleBin -Value $Bin -Option Constant
Remove-Variable -Name method, bin
