Automatically deleting old files from recycling bin while keeping the new ones?

I don't know of any Explorer add-ons, but like most things in Windows, this can be done with PowerShell:

ForEach ($Drive in Get-PSDrive -PSProvider FileSystem) {
    $Path = $Drive.Name + ':\$Recycle.Bin'
    Get-ChildItem $Path -Force -Recurse -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
    Remove-Item -Recurse

Save this script as a text file with a .ps1 extension. You can then use Task Scheduler to run this at regular intervals.

First, though, you need to permit the execution of PowerShell scripts, because by default you can only execute commands typed directly into the PowerShell prompt. To do this, open PowerShell and type in the following command:

Set-ExecutionPolicy RemoteSigned

Type in "y" or "yes" when prompted. See Get-Help Set-ExecutionPolicy for more information.

Now open Task Scheduler and create a new task with the following parameters:

  1. Under the "General" tab, enter a name and check the "Run with highest privileges" option
  2. Under the "Triggers" tab, add a new trigger and set the task to run daily
  3. Under the "Actions" tab, add a new action:
    • leave the type as "Start a program"
    • set the "Program/script" field to C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • set the "Add arguments" field to -NonInteractive -File "C:\path\to\script.ps1"
  4. Under the "Conditions" tab, uncheck "Start the task only if the computer is on AC power"

Line-by-line explanation of the script:

ForEach ($Drive in Get-PSDrive -PSProvider FileSystem) {

This gets a list of all drives in the computer and loops through them one by one. The -PSProvider FileSystem parameter is required to only return disk drives, because PowerShell also has pseudodrives for various other things like registry hives.

For more information, see Get-Help Get-PSDrive and this tutorial on loop processing in PowerShell.

$Path = $Drive.Name + ':\$Recycle.Bin'

This constructs the path to the Recycle Bin folder on the current drive. Note the use of single quotes around the second part, to prevent PowerShell from interpreting $Recycle as a variable.

Get-ChildItem $Path -Force -Recurse -ErrorAction SilentlyContinue |

This returns all files and subfolders under the given path (the one we constructed with the previous command). The -Force parameter is needed to go into hidden and system folders, and the -Recurse parameter makes the command recursive, ie. loop through all subdirectories as well. -ErrorAction is a standard parameter for most PowerShell commands, and the value SilentlyContinue makes the command ignore errors. The purpose of this is to prevent errors for drives that have been configured to delete files immediately. The | symbol at the very end pipes the results to the next command; I split it up to several lines for better readability.

For more information, see Get-Help Get-ChildItem.

Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |

This simply filters the results from the previous command and returns only those that are older than 30 days. $_ refers to the object currently being processed, and the LastWriteTime property in this case refers to the date and time that the file was deleted. Get-Date returns the current date.

For more information, see Get-Help Where-Object and Get-Help Get-Date.

Remove-Item -Recurse

This simply deletes the items passed to it by the previous command. The -Recurse parameter automatically deletes the contents of non-empty subfolders; without it, you'd be prompted for such folders.

For more information, see Get-Help Remove-Item.

RecycleBinEx is a simple application for Windows that does exactly what you ask. See:

On Mac OSX, Hazel does the same thing (among the others):

KDE Plasma ships this feature as default, so if you're running Kubuntu, Arch, Chackra Linux or any other distro with KDE, you already have this feature. Just look at Dolphin configuration window.

On Ubuntu Unity, Gnome or any other gnu/linux desktop environment providing a standard Trash feature you can use AutoTrash to do this thing:
Similar behaviour can be accomplished also with trash-cli, that could be used also to send files to trash can right from the command line. See:

Most email apps out there also have this feature for their "trash can".

On Android there isn't any "trash can" by default (when you delete it, it's gone forever), but you can install apps like Dumpster to (somehow) get similar features:

As said above, I think that automatically removing old files from trash can is a great feature to make it more usable, since it reduces clutter (are those files you trashed 3 months ago still relevant to you? And ALL those old revisions of the same file?) and makes easier to find what you want to recover (this is the reason for having a "trash can" on our computers, after all), still being safe.

It's even more useful if you work a lot with text files (code or prose), that most of the time are small and don't need a lot of space (so may never reach your trash can quota). This way you won't even need to periodically "empty your trash can". You just know that you have a window of time for recovering your "trashed" files if you need to.

Looking at most cloud services out there (Dropbox, Google Drive, Simplenote, ...), most of them seem to have a similar policy for deleted files. I really think it's the right thing to do with your files, and they seems to think so.

The Windows Recycle Bin automatically deletes older files when it reaches it's maximum size: What happens when Recycle Bin uses up its allocated space?

You can control this from the properties of the Recylce Bin

enter image description here