Bereinigungsskript mit PowerShell
Hallo,
da ich nicht soo die Ahnung von PowerShell habe muss ich euch mal was fragen.Ich soll ein Skript schreiben das alle Dateien die älter sind als 7 Tage löscht. Dieses Skript soll dann im Task Scheduler automatisch einmal wöchentlich ausgeführt werden. Sobald das Skript aber nicht ausgeführt werden kann z.b. durch irgendwelche Fehler sollen wir automatisch eine E-Mail bekommen. Ich habe den Code zum Bereinigen schon geschrieben, der Funktioniert auch wunderbar. Auch das E-Mail senden habe ich hinbekommen aber leider schickt der uns immer eine. Ich bekomme es nicht hin, das nur eine E-Mail geschickt wird, wenn das Skript nicht ausgeführt werden konnte. Ich poste mal unten meinen Code. Vielleicht könnt Ihr mir da weiterhelfen. Ich verzeifle langsam :D
Wo muss ich jetzt was hin, damit er mir nur eine email sendet, wenn das Skript nicht funktionieren sollte.
Vielen Dank im Vorraus.
da ich nicht soo die Ahnung von PowerShell habe muss ich euch mal was fragen.Ich soll ein Skript schreiben das alle Dateien die älter sind als 7 Tage löscht. Dieses Skript soll dann im Task Scheduler automatisch einmal wöchentlich ausgeführt werden. Sobald das Skript aber nicht ausgeführt werden kann z.b. durch irgendwelche Fehler sollen wir automatisch eine E-Mail bekommen. Ich habe den Code zum Bereinigen schon geschrieben, der Funktioniert auch wunderbar. Auch das E-Mail senden habe ich hinbekommen aber leider schickt der uns immer eine. Ich bekomme es nicht hin, das nur eine E-Mail geschickt wird, wenn das Skript nicht ausgeführt werden konnte. Ich poste mal unten meinen Code. Vielleicht könnt Ihr mir da weiterhelfen. Ich verzeifle langsam :D
dir "\\Ordnerpfad" | ?{$_.creationtime -lt ((Get-Date).AddDays(-7)) -and $_.PSIsContainer -and $_.Name -like '2016*'} | %{Remove-Item $_.FullName -force -recurse}
dir "\\Ordnerpfad" | ?{$_.creationtime -lt ((Get-Date).AddDays(-7)) -and $_.PSIsContainer -and $_.Name -like '2016*'} | %{Remove-Item $_.FullName -force -recurse}
$SendMail
$SendMail = send-mailmessage -to "meineemailadresse" -from "Absenderemailadresse" -subject "Bereinigungs " -smtpserver unser smtpserver
Wo muss ich jetzt was hin, damit er mir nur eine email sendet, wenn das Skript nicht funktionieren sollte.
Vielen Dank im Vorraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 301392
Url: https://administrator.de/forum/bereinigungsskript-mit-powershell-301392.html
Ausgedruckt am: 23.04.2025 um 04:04 Uhr
5 Kommentare
Neuester Kommentar
Moin,
ich denke ohne eine genaue Definition von "Sobald das Skript aber nicht ausgeführt werden" wird es keine passende Lösung geben. Ich würde sagen es gibt folgende Fehlerzustände:
Welche Fehlerzustände sollen abgefangen werden? Alle? Bestimmte?
Gruß,
Dani
ich denke ohne eine genaue Definition von "Sobald das Skript aber nicht ausgeführt werden" wird es keine passende Lösung geben. Ich würde sagen es gibt folgende Fehlerzustände:
- Ordnerpfad ist nicht mehr vorhanden
- Keine Zugriffsberechtigung auf den Ordnerpfad
- Aufplanung kann nicht gestartet werden
- Mailserver ist nicht erreichbar / Relay ohne SMTP-Authentifizierung ist nicht möglich
- ...
Welche Fehlerzustände sollen abgefangen werden? Alle? Bestimmte?
Gruß,
Dani
Hallo,
wie @Dani bereits geschrieben hat, müssen die Anforderungen genauer definiert werden.
Hier ist ein Beispiel, wenn der Pfad nicht gefunden werden kann:
Try / Catch kann ebenfalls verwendet werden.
Hier ein Beispiel: Bei der Exception Message kann variiert werden.
Kannst die Funktion auch weglassen oder den Mail versandt in eine eigene Funktion umschreiben die dann aufgerufen wird.
Gruß, Sascha
wie @Dani bereits geschrieben hat, müssen die Anforderungen genauer definiert werden.
Hier ist ein Beispiel, wenn der Pfad nicht gefunden werden kann:
function CheckPath {
$Path = "C:\Powershell"
IF (!(Test-Path -Path $Path)){
Write-Host "Exception Message: Path $Path not found"
$SendMail = send-mailmessage -to "meineemailadresse" -from "Absenderemailadresse" -subject "Bereinigungs " -smtpserver unser smtpserver
} ELSE {
Write-Host "Path $Path found"
Get-ChildItem $Path | Where-Object {$_.LastWriteTime -lt (get-date).adddays(-7)} | Foreach {Get-ChildItem $_.pspath | Remove-Item -recurse}
}
}
CheckPath
Try / Catch kann ebenfalls verwendet werden.
Hier ein Beispiel:
function CheckPath {
$Path = "C:\Powershell"
Try {
Get-ChildItem $Path -ErrorAction Stop | Where-Object {$_.LastWriteTime -lt (get-date).adddays(-7)} | Foreach {Get-ChildItem $_.pspath | Remove-Item -recurse}
} Catch {
Write-Host "Exception Message: Path $Path not found"
Write-Host $('Exception Message: ' + $_.Exception.Message)
$SendMail = send-mailmessage -to "meineemailadresse" -from "Absenderemailadresse" -subject "Bereinigungs " -smtpserver unser smtpserver
}
}
CheckPath
Kannst die Funktion auch weglassen oder den Mail versandt in eine eigene Funktion umschreiben die dann aufgerufen wird.
Gruß, Sascha
Hallo hillifant,
Ich fasse Mal zusammen was du möchtest:
Das Stichtwort $LASTEXITCODE ist ein guter Ansatz. Dazu solltest du dich einlesen und wie wird $LASTEXITCODE als Parameter in die Aufgabenplanung mit übernommen.
Ich weiß ehrlich gesagt nicht ob es überhaupt möglich ist. Denn es müsste eine Verkettung stattfinden (weitere Aktion) oder vielleicht innerhalb des Skripts mit Trap, habe dies Szenario selbst noch nicht durchgeführt.
Frage mal @colinardo oder @114757
Gruß, Sascha
Ich könnte mir die zwar aneignen, nur das würde jetzt für dieses Skript zulange dauern.
Das Wissen welches du dir aneignen wirst, wird dir nicht nur bei diesem Skript weiterhelfen, sondern bei allen weiteren die du schreibst oder erweiterst. Ich weiß es ist einfacher Copy & Paste zu machen, wenn schon die Grundkenntnisse nicht vorhanden sind meldest du dich in kürzester Zeit wieder. Also Buch / Tutorial schnappen und ran an den Speck.Ich fasse Mal zusammen was du möchtest:
- Das Skript soll über die Aufgabenplanung täglich/wöchentlich ausgeführt werden -> erledigt.
- Dabei soll es alle Daten die Älter als 7 Tage sind löschen -> erledigt.
- Läuft das Skript in einen Fehler soll es eine Mail versenden -> erledigt.
- Kann das Skript durch die Aufgabenplanung nicht ausgeführt werden, soll eine Mail versandt werden
Das Stichtwort $LASTEXITCODE ist ein guter Ansatz. Dazu solltest du dich einlesen und wie wird $LASTEXITCODE als Parameter in die Aufgabenplanung mit übernommen.
Ich weiß ehrlich gesagt nicht ob es überhaupt möglich ist. Denn es müsste eine Verkettung stattfinden (weitere Aktion) oder vielleicht innerhalb des Skripts mit Trap, habe dies Szenario selbst noch nicht durchgeführt.
Frage mal @colinardo oder @114757
Gruß, Sascha

Moin,
also geht es hier darum ob ein Skript überhaupt durch den Taskplaner gestartet wurde oder nicht ?? Oder den Status den man durch das Skript im Taskplaner ausgeben kann, dafür hatten wir hier schon mal was mit einem Eventtrigger für den Taskplaner:
Aufgabenplanungs-Ergebnis abfragen
Wenn du prüfen willst ob der Taskplaner der Fehler ist und das Skript nicht ausgeführt wird, schreibe im PS-Skript ein Statusfile irgendwo hin und dann prüfst du mit einem anderen Skript ob das Trigger-File vorhanden ist oder nicht und reagierst darauf. Das lässt sich aber auch mit PRTG und durch diverse Monitoring-Tools schnellstens abfackeln.
Gruß jodel32
also geht es hier darum ob ein Skript überhaupt durch den Taskplaner gestartet wurde oder nicht ?? Oder den Status den man durch das Skript im Taskplaner ausgeben kann, dafür hatten wir hier schon mal was mit einem Eventtrigger für den Taskplaner:
Aufgabenplanungs-Ergebnis abfragen
Wenn du prüfen willst ob der Taskplaner der Fehler ist und das Skript nicht ausgeführt wird, schreibe im PS-Skript ein Statusfile irgendwo hin und dann prüfst du mit einem anderen Skript ob das Trigger-File vorhanden ist oder nicht und reagierst darauf. Das lässt sich aber auch mit PRTG und durch diverse Monitoring-Tools schnellstens abfackeln.
Gruß jodel32