đź“„ Papierkorb bereinigen - Alle Benutzer

Papierkorb bereinigen - Alle Benutzer

Das Skript durchsucht die Papierkoerbe aller Benutzer auf dem Windows-Client.
Es loescht Dateien und Ordner aus dem Papierkorb, die aelter sind als der angegebene Wert in MaxAgeDays.
Wird kein gueltiger Wert uebergeben, verwendet das Skript automatisch 21 Tage.

Der Status bleibt OK, wenn das Skript erfolgreich gelaufen ist.
Der Status wird Warnung, wenn das Skript nicht korrekt ausgefuehrt werden konnte.

Die Ausgabe zeigt:

  • ob das Skript gelaufen ist
  • welches Dateialter verwendet wurde
  • wie viele Eintraege geloescht wurden
  • wie viel Speicherplatz freigegeben wurde
  • wann das Skript ausgefuehrt wurde


Allgemein

Allgemeine Informationen
Name (DE): Papierkorb bereinigen - Alle Benutzer
Name (EN): Clean Up Recycle Bin - All Users
Mode: Advanced script
Description: Das Skript durchsucht die Papierkörbe aller Benutzer auf Windows-Clients und löscht alle Dateien die älter sind als im Parameter "MaxAgeDays" angegeben.
Symbol: Trash2
Ketegorie: Custom
Intervall (Min.): 1440  (1 Tag)
Tags: custom

Skript

function Get-RecycleBinItemInfo {
param(
[Parameter(Mandatory = $true)]
[string]$MetadataFilePath
)

try {
$bytes = [System.IO.File]::ReadAllBytes($MetadataFilePath)

if ($bytes.Length -lt 24) {
return $null
}

$originalSize = [System.BitConverter]::ToInt64($bytes, 8)
$deletedFileTime = [System.BitConverter]::ToInt64($bytes, 16)

if ($deletedFileTime -le 0) {
return $null
}

$deletedAt = [System.DateTime]::FromFileTimeUtc($deletedFileTime).ToLocalTime()

if ($bytes.Length -gt 24) {
$pathBytes = $bytes[24..($bytes.Length - 1)]
$originalPath = [System.Text.Encoding]::Unicode.GetString($pathBytes).Trim([char]0)
}
else {
$originalPath = ""
}

return @{
DeletedAt = $deletedAt
OriginalSize = $originalSize
OriginalPath = $originalPath
}
}
catch {
return $null
}
}

function Format-ByteSize {
param(
[Parameter(Mandatory = $true)]
[Int64]$Bytes
)

if ($Bytes -ge 1TB) { return ("{0:N2} TB" -f ($Bytes / 1TB)) }
elseif ($Bytes -ge 1GB) { return ("{0:N2} GB" -f ($Bytes / 1GB)) }
elseif ($Bytes -ge 1MB) { return ("{0:N2} MB" -f ($Bytes / 1MB)) }
elseif ($Bytes -ge 1KB) { return ("{0:N2} KB" -f ($Bytes / 1KB)) }
else { return ("{0} Bytes" -f $Bytes) }
}

function Invoke-RecycleBinCleanupCheck {
$InputMaxAgeDays = 21

if (Get-Variable -Name "checkInput" -ErrorAction SilentlyContinue) {
try {
if ($null -ne $checkInput -and $null -ne $checkInput.MaxAgeDays -and "$($checkInput.MaxAgeDays)" -ne "") {
$InputMaxAgeDays = [int]$checkInput.MaxAgeDays
}
}
catch {
$InputMaxAgeDays = 21
}
}

if ($InputMaxAgeDays -lt 1) {
$ThresholdDays = 21
}
else {
$ThresholdDays = $InputMaxAgeDays
}

$cutoffDate = (Get-Date).AddDays(-$ThresholdDays)

$ScriptRan = $false
$DeletedItems = 0
$FreedBytes = [Int64]0

try {
$drives = Get-PSDrive -PSProvider FileSystem -ErrorAction Stop | Where-Object {
$_.Root -match '^[A-Z]:\\$'
}

foreach ($drive in $drives) {
$recycleRoot = Join-Path -Path $drive.Root -ChildPath '$Recycle.Bin'

if (-not (Test-Path -LiteralPath $recycleRoot)) {
continue
}

$metadataFiles = Get-ChildItem -LiteralPath $recycleRoot -Filter '$I*' -File -Recurse -Force -ErrorAction SilentlyContinue

foreach ($metadataFile in $metadataFiles) {
$itemInfo = Get-RecycleBinItemInfo -MetadataFilePath $metadataFile.FullName

if ($null -eq $itemInfo) {
continue
}

if ($itemInfo.DeletedAt -gt $cutoffDate) {
continue
}

try {
$relatedDataName = '$R' + $metadataFile.Name.Substring(2)
$relatedDataPath = Join-Path -Path $metadataFile.DirectoryName -ChildPath $relatedDataName

if (Test-Path -LiteralPath $relatedDataPath) {
Remove-Item -LiteralPath $relatedDataPath -Recurse -Force -ErrorAction Stop
}

Remove-Item -LiteralPath $metadataFile.FullName -Force -ErrorAction Stop

$DeletedItems++

if ($itemInfo.OriginalSize -gt 0) {
$FreedBytes += [Int64]$itemInfo.OriginalSize
}
}
catch {
}
}
}

$ScriptRan = $true
$FreedSpace = Format-ByteSize -Bytes $FreedBytes

Set-Variable -Name output -Scope Script -Value ([ordered]@{
checkResult = 0
ScriptRan = $ScriptRan
ThresholdDays = $ThresholdDays
DeletedItems = $DeletedItems
FreedSpace = $FreedSpace
Timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
InputMaxAgeDays = $InputMaxAgeDays
})
}
catch {
Set-Variable -Name output -Scope Script -Value ([ordered]@{
checkResult = 1
ScriptRan = $false
ThresholdDays = $ThresholdDays
DeletedItems = 0
FreedSpace = "0 Bytes"
Timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
InputMaxAgeDays = $InputMaxAgeDays
})
}
}

Invoke-RecycleBinCleanupCheck

Parameter

Parameter-SchlĂĽssel

Typ

Titel

Beschreibung

Standartwert

Pflichtfeld

MaxAgeDays

Number

Dateialter

Angabe, wie viele Tage alt eine Datei im Papierkorb sein muss, damit sie geloescht wird.

21

Ja

Ausgabe-Schema

SchlĂĽssel       | Typ     | Einheit          | Bezeichnung
-------------------------------------------------------------------------------------------
checkResult | Number | – | Statuscode (0=OK, 1=Warnung)
ScriptRan | Boolean | – | Skript erfolgreich ausgefuehrt
ThresholdDays | Number | Tage | Effektiv verwendete Altersgrenze
DeletedItems | Number | Anzahl | Anzahl der geloeschten Dateien
FreedSpace | String | KB/MB/GB/TB | Freigegebener Speicherplatz
Timestamp | String | Datum/Uhrzeit | Zeitpunkt der Ausfuehrung
InputMaxAgeDays | Number | Tage | Eingegebener Wert fuer das Dateialter

Beispiel fuer einen erfolgreichen Rueckgabewert

{
"checkResult": 0,
"ScriptRan": true,
"ThresholdDays": 30,
"DeletedItems": 0,
"FreedSpace": "0 Bytes",
"Timestamp": "2026-05-30 08:47:44",
"InputMaxAgeDays": 30
}

Detail Ansicht 

Verlaufs-Layout