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 Zitieren
NilsK 2.978 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 Zitieren
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. Zitieren
Sunny61 816 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)) Zitieren
MurdocX 965 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 Zitieren
Sunny61 816 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. Zitieren
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 Zitieren
Sunny61 816 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. Zitieren
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. Zitieren
Sunny61 816 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. Zitieren
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 Zitieren
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 Zitieren
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.