srkonus 10 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 Hallo zusammen, ich möchte in mir bekannten Verzeichnissen alle Dateien löschen, die älter als X Tage sind. Nach dem Löschvorgang möchte ich eine Benachrichtigung per Mail. Hierfür habe ich folgendes Script gebastelt: $logfolder1 = "C:\Share\folderA" $logfolder2 = "C:\Share\folderB" <# Keepdays bezeichnet die Verwahrdauer der Dateien #> $keepdays = 2 <# Aktuelles Datum ermitteln #> $date = Get-Date <# Löschdatum festlegen #> $olddate = $date.AddDays(-$keepdays) #erstelldatum der dateien auslesen und löschen Get-ChildItem -path $logfolder1 -Recurse *.* | where {$_.lastwritetime -lt $olddate} | Remove-Item -Force Get-ChildItem -path $logfolder2 -Recurse *.* | where {$_.lastwritetime -lt $olddate} | Remove-Item -Force #benachrichtigungsmail verschicken Send-MailMessage ` -to "Hans <hans@bla.de>" ` -Subject "test" ` -body "Dateien bis $olddate gelöscht" ` -SmtpServer "server" ` -from "powershell <powershell@bla.de>" ` -encoding ([System.Text.Encoding]::UTF8) ` Dies funktioniert soweit auch gut. Über Übersicht und Script-Stil lässt sich streiten :) Was fein wäre ist, das im Mail-Body die Namen der gelöschten bzw. zu löschenden Dateien lesbar aufgeführt werden. Habe was rumgespielt, gegoogelt und getestet, aber lesbar ist das nun auch wieder nicht: Function Format-FileSize() { Param ([int]$size) If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)} ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)} ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)} ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)} ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)} Else {""} } [String] $folder="C:\Temp\FolderA" Get-ChildItem -Path $folder -Recurse | Select-Object Name, @{Name="Size";Expression={Format-FileSize($_.Length)}} | Out-File C:\TEMP\text.txt $inhalt = Get-Content C:\TEMP\text.txt Send-MailMessage ` -to "Bernd <hans@bla.de>" ` -Subject "test" ` -body "$inhalt" ` -SmtpServer "server" ` -from "powershell <powershell@bla.de>" ` -encoding ([System.Text.Encoding]::UTF8) ` Hat jemand eine Idee, wie ich das machen kann (wenn es den möglich ist? Vielen Dank für jede Antwort. srkonus
NilsK 3.046 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 Moin, mit robocopy sollte sich das recht einfach erledigen lassen. Das bietet die Auswahloptionen, die du brauchst, loggt alles mit, kann auch Logdateien zum Versenden erzeugen, und es ist schnell. Ansatz: Schalter /MOVE zum Verschieben in ein temporäres Verzeichnis, dieses dann mit rd /s /q komplett löschen. Gruß, Nils
srkonus 10 Geschrieben 24. August 2016 Autor Melden Geschrieben 24. August 2016 Moin, mit robocopy sollte sich das recht einfach erledigen lassen. Das bietet die Auswahloptionen, die du brauchst, loggt alles mit, kann auch Logdateien zum Versenden erzeugen, und es ist schnell. Ansatz: Schalter /MOVE zum Verschieben in ein temporäres Verzeichnis, dieses dann mit rd /s /q komplett löschen. Gruß, Nils Hallo Nils, danke für Deine Antwort. Mein Script läuft ja und eine txt-Datei kann ich auch erstellen und als Anhang verschicken. Wenn möglich möchte ich aber den Inhalt der txt-Datei als Mail-Body haben.
Sunny61 833 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 In einem PS-Script tut das hier seinen Dienst: $message = new-object Net.Mail.MailMessage #$message_attachment = new-object Net.Mail.Attachment($logfile) $mailer = new-object Net.Mail.SmtpClient($SMTPServer) $message.Body = [string]::join([environment]::NewLine, (get-content $logfile))
MurdocX 1.004 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 (bearbeitet) In einem PS-Script tut das hier seinen Dienst: $message = new-object Net.Mail.MailMessage #$message_attachment = new-object Net.Mail.Attachment($logfile) $mailer = new-object Net.Mail.SmtpClient($SMTPServer) $message.Body = [string]::join([environment]::NewLine, (get-content $logfile)) Das geht noch bisschen einfacher ;) Send-MailMessage -Attachments Pfad -SmtpServer Server -From Von -To Zu -Body Nachricht -Subject Betreff -UseSsl EDIT: Dann etwas so.. Bei mir wird das Attachment in den Body gepackt, du hängst es an und ich muss die TXT per Doppelklick öffnen. Send-MailMessage -SmtpServer Server -From Von -To Zu -Body $(get-content $logfile) -Subject Betreff -UseSsl bearbeitet 24. August 2016 von MurdocX
Sunny61 833 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 Bei mir wird das Attachment in den Body gepackt, du hängst es an und ich muss die TXT per Doppelklick öffnen.
srkonus 10 Geschrieben 24. August 2016 Autor Melden Geschrieben 24. August 2016 (bearbeitet) Send-MailMessage -SmtpServer Server -From Von -To Zu -Body $(get-content $logfile) -Subject Betreff -UseSsl Der Hinweis ist gar nicht schlecht. Lasse mir das Ergebnis von get-childitem in eine txt-Datei schreiben. Diese gebe ich genauso wie Du an, allerdings kommt in der Mail nicht der Inhalt sondern folgendes an: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Edit: Hatte vergessen die Variable $logfile zu setzen. Wenn ich allerdings folgendes schreibe: [String] $folder="C:\Temp\FolderA" Get-ChildItem -Path $folder -Recurse | SELECT Attributes, Name, CreationTime, Length | Format-Table -AutoSize | Out-File C:\TEMP\logfile.txt $logfile = C:\TEMP\logfile.txt Send-MailMessage ` -to "Bernd <hans@bla.de>" ` -Subject "test" ` -body $(get-content $logfile) ` -SmtpServer "server" ` -from "powershell <powershell@bla.de>" ` -encoding ([System.Text.Encoding]::UTF8) ` wird zwar die Textdatei erstellt und gefüllt, allerdings wird der Inhalt nicht ausgelesen und als Body verwendet. bearbeitet 24. August 2016 von srkonus
Sunny61 833 Geschrieben 24. August 2016 Melden Geschrieben 24. August 2016 Ich weiß nicht genau warum, aber der Teil [string]::join([environment]::NewLine, steht mit Sicherheit nicht umsonst im Script. Probiers doch mal.
srkonus 10 Geschrieben 25. August 2016 Autor Melden Geschrieben 25. August 2016 Ich weiß nicht genau warum, aber der Teil [string]::join([environment]::NewLine, steht mit Sicherheit nicht umsonst im Script. Probiers doch mal. Leider verstehe ich Deinen Vorschlag nicht und weiß deswegen auch nicht, wo und wie ich ihn bei mir integrieren kann.
Sunny61 833 Geschrieben 25. August 2016 Melden Geschrieben 25. August 2016 Leider verstehe ich Deinen Vorschlag nicht und weiß deswegen auch nicht, wo und wie ich ihn bei mir integrieren kann. Schau dir doch mal meinen Teil vom Sript an, versuche es exakt so einzubauen.
massaraksch 41 Geschrieben 25. August 2016 Melden Geschrieben 25. August 2016 (bearbeitet) Hi, sieht so aus, als müßtest du dein "get-content " noch in einen String umwandeln. Versuchs so: entweder: $inhalt = get-content C:\TEMP\text.txt | out-string oder: $inhalt = (get-content C:\TEMP\text.txt) -join "`n" Dann Mail senden mit $inhalt als Body: Send-MailMessage -SmtpServer MAILSERVER -From VON -To AN -Body $inhalt -Subject Betreff PS: out-string hat erstmal den Nachteil, dass die Zeilenlänge auf die Breite des Hosts (der aktuellen Shell, d.h. im Standard 80 Zeichen) begrenzt ist. Kann man z.B. mit "Out-String -Width 1024" erweitern. Das "`n" bei join bedeutet Zeilenumbruch. PPS: Das [string]::join([environment]::NewLine von Sunny61 macht im Prinzip das gleiche wie mein -join "`n". bearbeitet 25. August 2016 von massaraksch
Beste Lösung srkonus 10 Geschrieben 25. August 2016 Autor Beste Lösung Melden Geschrieben 25. August 2016 (bearbeitet) Habe das ganze nun hinbekommen, meine Lösung sieht wie folgt aus: [String] $folder="C:\Temp\FolderA" Get-ChildItem -Path $folder -Recurse | SELECT Attributes, Name, CreationTime, Length | Format-Table -AutoSize | Out-File C:\TEMP\logfile.txt $inhalt = Get-Content -Path C:\TEMP\logfile.txt | Out-String Send-MailMessage ` -to "hans <hans@bla.de>" ` -Subject "test" ` -body "blablabla `r`n muhmuhmuh`r`n $inhalt" ` -SmtpServer "server" ` -from "powershell <powershell@bla.de>" ` -encoding ([System.Text.Encoding]::UTF8) ` Es geht sicherlich einfacher oder schöner, aber so verstehe ich das Ergebnis zumindest. bearbeitet 25. August 2016 von srkonus
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden