hillifant
Goto Top

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

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.

Content-Key: 301392

Url: https://administrator.de/contentid/301392

Printed on: April 19, 2024 at 06:04 o'clock

Member: Dani
Dani Apr 09, 2016 at 21:48:43 (UTC)
Goto Top
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:
  • 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
Member: SaschaRD
SaschaRD Apr 11, 2016 updated at 15:09:08 (UTC)
Goto Top
Hallo,

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
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
Member: hillifant
hillifant Apr 12, 2016 at 11:53:48 (UTC)
Goto Top
Hallo,

@SaschaRD dein Code hat super funktioniert. Es muss aber doch irgendwie die Möglichkeit geben das ich eine Mail bekomme, wenn das Script nicht ausgeführt werden konnte. Man kann ja schlecht vorher wissen, warum ein Skript abbricht bzw. nicht starten kann. Ich habe im Internet was von $LASTEXITCODE und $Error gelesen. Nur leider fehlen mir da die Kenntnisse. Ich könnte mir die zwar aneignen, nur das würde jetzt für dieses Skript zulange dauern.
Member: SaschaRD
SaschaRD Apr 15, 2016 updated at 09:05:44 (UTC)
Goto Top
Hallo hillifant,

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
Mitglied: 114757
114757 Apr 15, 2016 updated at 09:12:36 (UTC)
Goto Top
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