srkonus 10 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
NilsK 2.958 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
srkonus 10 Geschrieben 24. August 2016 Autor Melden Teilen 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 Link zu diesem Kommentar
Sunny61 807 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
MurdocX 954 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
Sunny61 807 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
srkonus 10 Geschrieben 24. August 2016 Autor Melden Teilen 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 Link zu diesem Kommentar
Sunny61 807 Geschrieben 24. August 2016 Melden Teilen 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 Link zu diesem Kommentar
srkonus 10 Geschrieben 25. August 2016 Autor Melden Teilen 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 Link zu diesem Kommentar
Sunny61 807 Geschrieben 25. August 2016 Melden Teilen 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 Link zu diesem Kommentar
massaraksch 41 Geschrieben 25. August 2016 Melden Teilen 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 Link zu diesem Kommentar
Beste Lösung srkonus 10 Geschrieben 25. August 2016 Autor Beste Lösung Melden Teilen 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 Link zu diesem Kommentar
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.