itnirvana
Goto Top

Löschscript mit Datum anpassen

Hallo zusammen,

ich möchte gerne dieses Lösch Script anpassen

https://www.tech-faq.net/dateien-loeschen-die-aelter-sind-als-x-tage/#go ...

Nun haben wir diese Anforderung:
- Daten der letzen Periode müssen immer vorhanden sein.
- Daten bleiben bis zum 31 März im Folgejahr gespeichtet
- Danach werden diese unwiederruflich gelöscht.

Wie kann ich dieses Datum in das Löschscript einbauen ?

Gruss
Paul

Content-ID: 6805629755

Url: https://administrator.de/forum/loeschscript-mit-datum-anpassen-6805629755.html

Ausgedruckt am: 19.04.2025 um 08:04 Uhr

3063370895
3063370895 17.04.2023 aktualisiert um 11:11:26 Uhr
Goto Top
Hi,

beschreibe bitte genau, was du brauchst, so kann dir keiner helfen.

- Daten der letzen Periode müssen immer vorhanden sein.
Welche Periode? Wahlperiode der Bundestagswahl? 01.01. bis 31.12.?

- Daten bleiben bis zum 31 März im Folgejahr gespeichtet
Am 31. März sollen welche Daten genau gelöscht werden?

- Danach werden diese unwiederruflich gelöscht.
Was heißt für dich unwiderruflich gelöscht? So dass ein Datenrettungssprofi sie nicht wiederherstellen kann? Oder so, dass sie nicht im Papierkorb liegen?

-Thomas
itnirvana
itnirvana 17.04.2023 um 11:40:20 Uhr
Goto Top
Hallo,

ja die Anfordung ist komisch..
- Periode ist hier 1 Monat
- Am 31. März dann alles vom Vorjahr
- Diese sind dann Filemässig nicht mehr vorhanden.

Gruss
Paul
3063370895
3063370895 17.04.2023 aktualisiert um 11:57:17 Uhr
Goto Top
- Periode ist hier 1 Monat
Also du willst alle Dateien löschen, die von vor letztem Monat stammen?
- Am 31. März dann alles vom Vorjahr
Aber die Daten sind dann doch schon gelöscht?
- Diese sind dann Filemässig nicht mehr vorhanden.
okay

Sorry, kann auch sein dass ich gerade auf der Leitung stehe.
So löscht das Skript alle Dateien, die älter als der 1. des letzten Monats sind:

$Source = "C:\Temp"  
$ext = "*.bat","*.cat"	  

$log = Join-Path -Path $Source -ChildPath "$(get-date -format yymmddHHmmss).txt"  

$startDate = (Get-Date).AddMonths(-1)
$1stoflastmonth = [DateTime]::new( $startDate.Year, $startDate.Month, 1, 0, 0, 0)

Start-Transcript $log
Get-ChildItem $Source -Include $ext -Recurse -File | Where-Object LastWriteTime -lt $1stoflastmonth | Remove-Item -Force -Verbose
Stop-Transcript
Kraemer
Kraemer 17.04.2023 um 12:01:51 Uhr
Goto Top
Zitat von @3063370895:
- Periode ist hier 1 Monat
Also du willst alle Dateien löschen, die von vor letztem Monat stammen?
meine Glaskugel sagt, dass er alles bis Ende April behalten will, und dann alles bis ende März löscht
em-pie
em-pie 17.04.2023 um 12:16:30 Uhr
Goto Top
Moin,

@itnirvana: wie du merkst, aus deiner Angabe der Zeiträume wird keiner schlau.

Mein Versuch - um erstmal das Datum abzufangen:
Heute ist der 17.04.2023. Du willst demnach alles löschen, was ÄLTER als der 31.03.2022 ist
Wenn heute der 18.05.2023 wäre, müsste alles gelöscht werden, was älter denn 30.04.2022 ist

Falls das nicht korrekt ist, gibt bitte mal zwei... drei Beispiele an, was die Basis ist und welches Datum dann für den Löschprozess herangezogen werden muss...

Gruß
em-pie
3063370895
3063370895 17.04.2023 um 12:19:39 Uhr
Goto Top
Zitat von @em-pie:
Mein Versuch - um erstmal das Datum abzufangen:
Heute ist der 17.04.2023. Du willst demnach alles löschen, was ÄLTER als der 31.03.2022 ist
Wenn heute der 18.05.2023 wäre, müsste alles gelöscht werden, was älter denn 30.04.2022 ist

Falls das nicht korrekt ist, gibt bitte mal zwei... drei Beispiele an, was die Basis ist und welches Datum dann für den Löschprozess herangezogen werden muss...

Falls das korrekt ist, passt mein Skript oben
Löschscript mit Datum anpassen
itnirvana
itnirvana 18.04.2023 um 13:22:26 Uhr
Goto Top
Hallo,

ja genau.

- Was ist eine Periode ? 1 Monat
- Dann heisst es am 01.04.xx lösche ich das gesamte vorherige Jahr ? Ja

Gruss
Paul
itnirvana
itnirvana 19.04.2023 um 09:21:05 Uhr
Goto Top
Hallo,

im Endeffect muss das Script nur prüfen. ist heute später als der 31.3 , dann lösche das Vorjahr..

Gruss
Paul
3063370895
3063370895 19.04.2023 um 09:27:53 Uhr
Goto Top
Zitat von @itnirvana:

Hallo,

im Endeffect muss das Script nur prüfen. ist heute später als der 31.3 , dann lösche das Vorjahr..

Gruss
Paul

Jetzt wird ein Schuh draus.

Mach einen Scheduled Task für jeden 01.04. der folgendes ausführt:

$folder = "C:\tmp"  
$firstDayofYear = [datetime]::new((Get-Date).Year,1,1,0,0,0)

Get-ChildItem -File -Path $folder -Recurse | Where-Object LastWriteTime -lt $firstDayofYear | Remove-Item -Force

Bitte vorher mit Testdaten ausprobieren.
Kraemer
Kraemer 19.04.2023 um 09:32:52 Uhr
Goto Top
Zitat von @3063370895:

$folder = "C:\tmp"  
$firstDayofYear = [datetime]::new((Get-Date).Year,1,1,0,0,0)

Get-ChildItem -File -Path $folder -Recurse | Where-Object LastWriteTime -lt $firstDayofYear | Remove-Item -Force

[datetime]::new((Get-Date).Year,4,1,0,0,0)
?
itnirvana
itnirvana 19.04.2023 um 09:57:42 Uhr
Goto Top
Danke. Habe zeitgleich Chat GPT gefragt. Grass das Ergebnis

$currentYear = Get-Date -Format "yyyy"  
$lastYear = $currentYear - 1

$lastMarch = Get-Date -Year $currentYear -Month 3 -Day 31
if (Get-Date -gt $lastMarch) {
    # Lösche alle Objekte aus dem letzten Jahr
    Get-ChildItem | Where-Object { $_.LastWriteTime.Year -eq $lastYear } | Remove-Item -Recurse -Force
} else {
    # Beende das Skript, da das aktuelle Datum vor dem 31. März des aktuellen Jahres liegt
    Write-Host "Das aktuelle Datum liegt vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

In diesem Skript wird zuerst das aktuelle Jahr ermittelt, dann wird das Datum des 31. März des aktuellen Jahres erstellt. Wenn das aktuelle Datum später als der 31. März des aktuellen Jahres ist, werden alle Objekte im aktuellen Verzeichnis gelöscht, die aus dem letzten Jahr stammen. Andernfalls wird eine Nachricht ausgegeben, dass das Skript beendet wird, da das aktuelle Datum vor dem 31. März des aktuellen Jahres liegt.


Mal schauen. ich muss das mit dem obern Script kombinieren.
3063370895
3063370895 19.04.2023 aktualisiert um 10:17:57 Uhr
Goto Top
Zitat von @Kraemer:

Zitat von @3063370895:

$folder = "C:\tmp"  
$firstDayofYear = [datetime]::new((Get-Date).Year,1,1,0,0,0)

Get-ChildItem -File -Path $folder -Recurse | Where-Object LastWriteTime -lt $firstDayofYear | Remove-Item -Force

[datetime]::new((Get-Date).Year,4,1,0,0,0)
?

Nein, ich brauche das Datum um Daten zu löschen die älter sind als das angegeben. deswegen der 01.01.
im Endeffect muss das Script nur prüfen. ist heute später als der 31.3 , dann lösche das Vorjahr..

Mein script sollte als Scheduled Task am 01.04. jedes Jahres ausgeführt werden.
itnirvana
itnirvana 19.04.2023 um 10:30:04 Uhr
Goto Top
Es wäre nun so
$currentYear = Get-Date -Format "yyyy"  
$lastYear = $currentYear - 1

$lastMarch = Get-Date -Year $currentYear -Month 3 -Day 31

$DeletePath = "D:\Archiedaten\"  
$LogFile = "D:\Archiedaten\DeleteLog.txt"  

if (Get-Date -gt $lastMarch) {
    # Lösche alle ZIP-Dateien aus dem letzten Jahr im angegebenen Pfad
    $deletedItems = Get-ChildItem -Path $DeletePath -Recurse -File -Include *.zip | Where-Object { $_.LastWriteTime.Year -eq $lastYear } | Remove-Item -Force -ErrorAction SilentlyContinue

    # Schreibe eine Log-Nachricht mit der Gesamtzahl der gelöschten Dateien und der Gesamtgröße in GB
    if ($deletedItems) {
        $totalSize = ($deletedItems | Measure-Object -Property Length -Sum).Sum / 1GB
        $totalCount = $deletedItems.Count
        $logMessage = "Es wurden insgesamt $totalCount ZIP-Dateien mit einer Gesamtgröße von $totalSize GB aus dem Verzeichnis $DeletePath gelöscht."  
        Write-Output $logMessage | Out-File $LogFile -Append

        # Erstelle ein zweites Log-File mit Anzahl der gelöschten Dateien und Gesamtgröße pro Kunde
        Get-ChildItem -Path $DeletePath -Directory | ForEach-Object {
            $customerPath = $_.FullName
            $customerName = $_.Name

            $customerDeletedItems = Get-ChildItem -Path $customerPath -Recurse -File -Include *.zip | Where-Object { $_.LastWriteTime.Year -eq $lastYear } | Remove-Item -Force -ErrorAction SilentlyContinue
            if ($customerDeletedItems) {
                $customerTotalSize = ($customerDeletedItems | Measure-Object -Property Length -Sum).Sum / 1GB
                $customerTotalCount = $customerDeletedItems.Count
                $customerLogMessage = "Es wurden $customerTotalCount ZIP-Dateien mit einer Gesamtgröße von $customerTotalSize GB aus dem Verzeichnis $customerPath gelöscht."  
                Write-Output $customerLogMessage | Out-File "$DeletePath\$customerName-DeleteLog.txt" -Append  
            }
        }
    } else {
        Write-Host "Es wurden keine ZIP-Dateien im Verzeichnis $DeletePath gefunden, die gelöscht werden konnten."  
    }
} else {
    # Beende das Skript, da das aktuelle Datum vor dem 31. März des aktuellen Jahres liegt
    Write-Host "Das aktuelle Datum liegt vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

Damit löscht es nur ZIP Files aber keine Ordner.

Nun hier die Zweite Version:
Jeder Subfolder unter dem ersten entspricht einem Kunde. Daher ein zweite Lögfile das Kunde und Löschgrösse Anzahl Files anzeigt

$currentYear = Get-Date -Format "yyyy"  
$lastYear = $currentYear - 1

$lastMarch = Get-Date -Year $currentYear -Month 3 -Day 31

$DeletePath = "D:\Archiedaten\"  
$LogFile = "D:\Archiedaten\DeleteLog.txt"  
$CustomerLogFile = "D:\Archiedaten\CustomersDeleteLog.txt"  

if (Get-Date -gt $lastMarch) {
    # Lösche alle ZIP-Dateien aus dem letzten Jahr im angegebenen Pfad
    $deletedItems = Get-ChildItem -Path $DeletePath -Recurse -File -Include *.zip | Where-Object { $_.LastWriteTime.Year -eq $lastYear } | Remove-Item -Force -ErrorAction SilentlyContinue

    # Schreibe eine Log-Nachricht mit der Gesamtzahl der gelöschten Dateien und der Gesamtgröße in GB
    if ($deletedItems) {
        $totalSize = ($deletedItems | Measure-Object -Property Length -Sum).Sum / 1GB
        $totalCount = $deletedItems.Count
        $logMessage = "Es wurden insgesamt $totalCount ZIP-Dateien mit einer Gesamtgröße von $totalSize GB aus dem Verzeichnis $DeletePath gelöscht."  
        Write-Output $logMessage | Out-File $LogFile -Append

        # Erstelle ein zweites Log-File mit Anzahl der gelöschten Dateien und Gesamtgröße pro Kunde
        $customerLogMessages = Get-ChildItem -Path $DeletePath -Directory | ForEach-Object {
            $customerPath = $_.FullName
            $customerName = $_.Name

            $customerDeletedItems = Get-ChildItem -Path $customerPath -File -Include *.zip | Where-Object { $_.LastWriteTime.Year -eq $lastYear } | Remove-Item -Force -ErrorAction SilentlyContinue
            if ($customerDeletedItems) {
                $customerTotalSize = ($customerDeletedItems | Measure-Object -Property Length -Sum).Sum / 1GB
                $customerTotalCount = $customerDeletedItems.Count
                $customerLogMessage = "Es wurden $customerTotalCount ZIP-Dateien mit einer Gesamtgröße von $customerTotalSize GB aus dem Verzeichnis $customerPath gelöscht."  
                Write-Output $customerLogMessage

                # Schreibe die Kunden-Log-Nachricht in die Log-Datei des Kunden
                Write-Output $customerLogMessage | Out-File "$customerPath\$customerName-DeleteLog.txt" -Append  
            }
        }

        # Schreibe die Kunden-Log-Nachrichten in das vereinigte Log-File
        Write-Output "`nKunden-Log-Nachrichten:`n" | Out-File $CustomerLogFile -Append  
        Write-Output $customerLogMessages | Out-File $CustomerLogFile -Append
    } else {
        Write-Host "Es wurden keine ZIP-Dateien im Verzeichnis $DeletePath gefunden, die gelöscht werden konnten."  
    }
} else {
    # Beende das Skript, da das aktuelle Datum vor dem 31. März des aktuellen Jahres liegt
    Write-Host "Das aktuelle Datum liegt vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

Nun die Dritte Version löscht nicht, sondern zeigt nur alles an , was es löchen würde....

# Set the delete path and log file paths
$DeletePath = "D:\Archiedaten\"  
$LogPath1 = "D:\DeleteLog.txt"  
$LogPath2 = "D:\CustomerDeleteLog.txt"  

# Get the current year and March 31st of the current year
$CurrentYear = (Get-Date).Year
$March31 = Get-Date -Year $CurrentYear -Month 3 -Day 31

# Initialize variables for total deleted file size and count
$TotalDeletedSize = 0
$TotalDeletedCount = 0

# Get a list of all zip files in the delete path that were last modified before March 31st of the current year
$FilesToDelete = Get-ChildItem -Path $DeletePath -Filter *.zip -Recurse |
                 Where-Object { $_.LastWriteTime -lt $March31 }

# Loop through the list of files to delete and write information about them to the log files
foreach ($File in $FilesToDelete) {
    # If the file is in a subdirectory of the delete path, get the customer name
    $CustomerName = ""  
    $Subdirectory = $File.DirectoryName.Replace($DeletePath, "")  
    if ($Subdirectory) {
        $CustomerName = $Subdirectory.Split("\")[0]  
    }

    # Log the file information to the first log file
    $LogEntry = "{0}`t{1}`t{2}" -f $File.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"), $File.FullName, $CustomerName  
    Add-Content -Path $LogPath1 -Value $LogEntry

    # If the customer name is not empty, log the file information to the customer-specific log file
    if ($CustomerName) {
        $CustomerLogPath = Join-Path -Path $DeletePath -ChildPath "$CustomerName\CustomerDeleteLog.txt"  
        $LogEntry = "{0}`t{1}" -f $File.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"), $File.FullName  
        Add-Content -Path $CustomerLogPath -Value $LogEntry
    }

    # Update the total deleted file size and count
    $TotalDeletedSize += $File.Length
    $TotalDeletedCount++
}

# Write the total deleted file size and count to the first log file
$TotalDeletedSizeGB = "{0:N2}" -f ($TotalDeletedSize / 1GB)  
$TotalLogEntry = "Total deleted files: {0}`tTotal deleted size: {1} GB" -f $TotalDeletedCount, $TotalDeletedSizeGB  
Add-Content -Path $LogPath1 -Value $TotalLogEntry
3063370895
3063370895 19.04.2023 um 10:41:58 Uhr
Goto Top
Sorry, aber es ist echt schwierig, dir zu helfen.

Wenn du das willst:
im Endeffect muss das Script nur prüfen. ist heute später als der 31.3 , dann lösche das Vorjahr..

brauchst du nur dieses Skript als scheduled task 1x im Jahr am 01.04. ausführen:

$folder = "C:\tmp"  
$firstDayofYear = [datetime]::new((Get-Date).Year,1,1,0,0,0)

Get-ChildItem -File -Path $folder -Recurse | Where-Object LastWriteTime -lt $firstDayofYear | Remove-Item -Force
itnirvana
itnirvana 19.04.2023 um 10:52:38 Uhr
Goto Top
Im Test hat das anzeige Script versagt. Es hätte Dateien gelöscht die auch im aktuellen Jahr sind..

Das ist scheinbar nun korrigiert

$CurrentYear = Get-Date -Year (Get-Date).Year -Month 1 -Day 1
$CutoffDate = $CurrentYear.AddMonths(3).AddDays(-1)

if ((Get-Date) -gt $CutoffDate) {
    $DeleteYear = (Get-Date).AddYears(-1).Year
    $DeletePath = "D:\DSigArchive\*\$DeleteYear\*.zip"  
    $LogFile = "D:\DSigArchive\DeleteLog.txt"  
    $CombinedLogFile = "D:\DSigArchive\CombinedLog.txt"  
    
    $TotalSize = 0
    $TotalFiles = 0
    
    Get-ChildItem -Path $DeletePath -File -Recurse | ForEach-Object {
        $TotalSize += $_.Length
        $TotalFiles++
        $_ | Remove-Item -Force -WhatIf
    }
    
    $SizeInGB = [Math]::Round($TotalSize / 1GB, 2)
    
    Write-Output "In $DeleteYear, $TotalFiles ZIP files with a total size of $SizeInGB GB would be deleted." | Tee-Object -FilePath $LogFile  
    
    Get-ChildItem -Path "D:\DSigArchive\" -Directory | ForEach-Object {  
        $CustomerLog = $_.FullName + "\DeleteLog.txt"  
        Get-ChildItem -Path "$($_.FullName)\$DeleteYear\*.zip" -File -Recurse | ForEach-Object {  
            $TotalSize += $_.Length
            $TotalFiles++
            $_ | Remove-Item -Force -WhatIf
        }
        $SizeInGB = [Math]::Round($TotalSize / 1GB, 2)
        Write-Output "In $DeleteYear, $TotalFiles ZIP files with a total size of $SizeInGB GB would be deleted for customer $($_.Name)." | Tee-Object -FilePath $CustomerLog  
    }
    
    Get-ChildItem -Path "D:\DSigArchive\" -Directory | ForEach-Object {  
        $CustomerLog = $_.FullName + "\DeleteLog.txt"  
        Get-Content $CustomerLog | Out-File -Append -Encoding utf8 $CombinedLogFile
    }
}
else {
    Write-Output "It is before the cutoff date of $CutoffDate. No files will be deleted." | Tee-Object -FilePath $LogFile  
}
itnirvana
itnirvana 19.04.2023 um 11:09:50 Uhr
Goto Top
irgendwie gehen die Scripte nicht....

Ich teste mal das , ohne Chatgpt...
itnirvana
itnirvana 19.04.2023 um 12:47:38 Uhr
Goto Top
Hallo,

ich habe nun das Script soweit

# Beschreibung:
# Dieses Skript zeigt Dateien, die eine bestimmte Anzahl von Tagen alt sind. Die Dateierweiterungen, das Alter sowie der Ablageort sind definierbar.
# Der Anzeigevorg erstreckt sich auf alle Unterordner. Alle Operationen werden in einem Logfile im Quellordner gespeichert
# !!! Benutzung auf eigene Gefahr !!!
#
# Hier können Sie den Quellordner, das Alter der Dateien (in Tagen) und die Dateierweiterungen festlegen
$Source = "D:\DSigArchive\"		# Wichtig: muss mit "\" enden  
$Days = 485					# Anzahl der Tage, nach denen die Dateien angezeigt werden
$ext = "*.zip"  
$log = "$Source$(get-date -format yymmddHHmmss).txt"  
$DateBeforeXDays = (Get-Date).AddDays(-$Days)

$currYear = Get-Date -Year (Get-Date).Year
$mar31 = Get-Date -Month 3 -Day 31 -Year (Get-Date).Year

if ($currYear -lt $mar31) {
    Write-Host "Das Datum ist vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}


# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"  
write-host "Anzeigen aller Dateien ($ext) im Ordner $Source die aelter sind als $Days Tage."  
write-host "--------------------------------------------------------------------------------------"  
$files = get-childitem $Source\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays -and -not $_.psiscontainer}
$totallength = ($files | Measure-Object -Sum Length).Sum / 1GB
$totalfilescount = ($files | Measure-Object).count
$files
Write-Host "Gesamtgröße (GB) $totallength ($totalfilescount Files)" -ForegroundColor Green  
stop-transcript

Es löscht erstmal nicht. Aber es zeigt an, was es macht. Wie kann man es ergänzen, das es alle ZIP Datien älter als 31.Dezermber vorjahr löscht.

Gruss
Paul
3063370895
3063370895 19.04.2023 aktualisiert um 12:57:35 Uhr
Goto Top
Das ist mein letzter Versuch, dir zu helfen

# Beschreibung:
# Dieses Skript zeigt Dateien, die eine bestimmte Anzahl von Tagen alt sind. Die Dateierweiterungen, das Alter sowie der Ablageort sind definierbar.
# Der Anzeigevorg erstreckt sich auf alle Unterordner. Alle Operationen werden in einem Logfile im Quellordner gespeichert
# !!! Benutzung auf eigene Gefahr !!!
#
# Hier können Sie den Quellordner, das Alter der Dateien (in Tagen) und die Dateierweiterungen festlegen
$Source = "D:\DSigArchive\"		# Wichtig: muss mit "\" enden  
$Days = 485					# Anzahl der Tage, nach denen die Dateien angezeigt werden
$ext = "*.zip"  
$log = "$Source$(get-date -format yymmddHHmmss).txt"  
$DateBeforeXDays = (Get-Date).AddDays(-$Days)

$mar31 = Get-Date -Month 3 -Day 31 -Year (Get-Date).Year

if ((Get-Date) -lt $mar31) {
    Write-Host "Das Datum ist vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}


# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"  
write-host "Anzeigen aller Dateien ($ext) im Ordner $Source die aelter sind als $Days Tage."  
write-host "--------------------------------------------------------------------------------------"  
$files = get-childitem $Source\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays -and -not $_.psiscontainer}
$totallength = ($files | Measure-Object -Sum Length).Sum / 1GB
$totalfilescount = ($files | Measure-Object).count
$files
$files | Remove-Item -Force
Write-Host "Gesamtgröße (GB) $totallength ($totalfilescount Files)" -ForegroundColor Green  
stop-transcript

btw.. wtf?
$currYear = Get-Date -Year (Get-Date).Year

Die Logik erschließt sich mir jedoch nicht. Warum willst du ein Skript jeden Tag ausführen, welches nur an einem Tag laufen soll?
Warum nicht direkt nur an dem Tag ausführen?
itnirvana
itnirvana 19.04.2023 um 13:45:58 Uhr
Goto Top
Hallo,

jetzt habe ich es glaube ich. Dieses Script zeigt nun die Dateien an:

# Beschreibung:
# Dieses Skript zeigt ZIP-Dateien, die älter als der 31. Dezember des Vorjahres sind. Die Ablageort ist definierbar.
# Der Anzeigevorg erstreckt sich auf alle Unterordner. Alle Operationen werden in einem Logfile im Quellordner gespeichert.
# !!! Benutzung auf eigene Gefahr !!!
#
# Hier können Sie den Quellordner und die Dateierweiterungen festlegen
$Source = "C:\Windows\temp\"      # Wichtig: muss mit "\" enden  
$ext = "*.zip"  
$log = "$Source$(get-date -format yymmddHHmmss).txt"  

$currYear = Get-Date -Year (Get-Date).Year
$mar31 = Get-Date -Month 3 -Day 31 -Year (Get-Date).Year

if ($currYear -lt $mar31) {
    Write-Host "Das Datum ist vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

$vorjahr = (Get-Date).AddYears(-1).Year
$ende_jahr = Get-Date -Day 31 -Month 12 -Year $vorjahr

# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"  
write-host "Anzeigen aller ZIP-Dateien ($ext) im Ordner $Source, die älter als der 31. Dezember des Vorjahres ($vorjahr) sind."  
write-host "--------------------------------------------------------------------------------------"  
$files = get-childitem $Source\* -include $ext -recurse | where {$_.lastwritetime -lt $ende_jahr -and -not $_.psiscontainer}
$totallength = ($files | Measure-Object -Sum Length).Sum / 1GB
$totalfilescount = ($files | Measure-Object).count
$files | select FullName, LastWriteTime, @{n="Size (GB)";e={$_.length / 1GB}} | format-table -AutoSize  
Write-Host "Gesamtgröße (GB) $($totallength.ToString("F")) ($totalfilescount Files)" -ForegroundColor Green  
stop-transcript

Nun muss es nur scharf stellen...
itnirvana
itnirvana 19.04.2023 um 13:48:18 Uhr
Goto Top
Das wäre nun das Löschscript dazu

# Beschreibung:
# Dieses Skript löscht ZIP-Dateien, die älter als der 31. Dezember des Vorjahres sind. Die Ablageort ist definierbar.
# Der Anzeigevorg erstreckt sich auf alle Unterordner. Alle Operationen werden in einem Logfile im Quellordner gespeichert.
# !!! Benutzung auf eigene Gefahr !!!
#
# Hier können Sie den Quellordner und die Dateierweiterungen festlegen
$Source = "C:\Windows\temp\"      # Wichtig: muss mit "\" enden  
$ext = "*.zip"  
$log = "$Source$(get-date -format yymmddHHmmss).txt"  

$currYear = Get-Date -Year (Get-Date).Year
$mar31 = Get-Date -Month 3 -Day 31 -Year (Get-Date).Year

if ($currYear -lt $mar31) {
    Write-Host "Das Datum ist vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

$vorjahr = (Get-Date).AddYears(-1).Year
$ende_jahr = Get-Date -Day 31 -Month 12 -Year $vorjahr

# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"  
write-host "Löschen aller ZIP-Dateien ($ext) im Ordner $Source, die älter als der 31. Dezember des Vorjahres ($vorjahr) sind."  
write-host "--------------------------------------------------------------------------------------"  
$files = get-childitem $Source\* -include $ext -recurse | where {$_.lastwritetime -lt $ende_jahr -and -not $_.psiscontainer}
$totalfilescount = ($files | Measure-Object).count
$deletedfilescount = 0

foreach ($file in $files) {
    Write-Host "Lösche Datei $($file.FullName)..." -ForegroundColor Yellow  
    Remove-Item -Path $file.FullName -Force
    if (Test-Path $file.FullName) {
        Write-Host "FEHLER: Datei $($file.FullName) konnte nicht gelöscht werden!" -ForegroundColor Red  
    } else {
        Write-Host "Datei $($file.FullName) erfolgreich gelöscht." -ForegroundColor Green  
        $deletedfilescount++
    }
}

Write-Host "Es wurden $deletedfilescount von $totalfilescount Dateien gelöscht." -ForegroundColor Green  
stop-transcript


Gruss
Paul
itnirvana
itnirvana 19.04.2023 um 14:31:20 Uhr
Goto Top
# Autor: 
# Script nur aktiv wenn wir im aktuellen Jahr nach dem 31. März sind.
# Datum: 19.04.2023
# Beschreibung:
# Dieses Skript zeigt ZIP-Dateien, die älter als der 31. Dezember des Vorjahres sind. Die Ablageort ist definierbar.
# Der Anzeigevorg erstreckt sich auf alle Unterordner. Alle Operationen werden in einem Logfile im Quellordner gespeichert.
# !!! Benutzung auf eigene Gefahr !!!
#
# Hier können Sie den Quellordner und die Dateierweiterungen festlegen
$Source = "c:\windows\temp\"      # Wichtig: muss mit "\" enden  
$ext = "*.zip"  
$log = "$Source$(get-date -format yymmddHHmmss).txt"  

$currYear = Get-Date -Year (Get-Date).Year
$mar31 = Get-Date -Month 3 -Day 31 -Year (Get-Date).Year

if ($currYear -lt $mar31) {
    Write-Host "Das Datum ist vor dem 31. März des aktuellen Jahres. Das Skript wird beendet."  
    Exit
}

$vorjahr = (Get-Date).AddYears(-1).Year
$ende_jahr = Get-Date -Day 31 -Month 12 -Year $vorjahr

# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"  
write-host "Anzeigen aller ZIP-Dateien ($ext) im Ordner $Source, die älter als der 31. Dezember des Vorjahres ($vorjahr) sind."  
write-host "--------------------------------------------------------------------------------------"  

$folders = Get-ChildItem $Source -Directory
foreach ($folder in $folders) {
    $files = get-childitem $folder.FullName -include $ext -recurse | where {$_.lastwritetime -lt $ende_jahr -and -not $_.psiscontainer}
    $totallength = ($files | Measure-Object -Sum Length).Sum / 1GB
    $totalfilescount = ($files | Measure-Object).count
    $files | select FullName, LastWriteTime, @{n="Size (GB)";e={$_.length / 1GB}} | format-table -AutoSize  

    Write-Host "Gesamtgroesse (GB) $($totallength.ToString("F")) ($totalfilescount Files) werden von $folder gelöscht." -ForegroundColor Green  
    $files 
}

stop-transcript

Hier fasse ich im Log nachmals den zweiten Ordner , die Subfolder zusammen. Da dies Kunden darstellen.