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
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-RecycleBinCleanupCheckParameter
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

