Jump to content

Dateien älter X Tage löschen, Benachrichtigung per Mail


Direkt zur Lösung Gelöst von srkonus,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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 von MurdocX
Link zu diesem Kommentar
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 von srkonus
Link zu diesem Kommentar

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 von massaraksch
Link zu diesem Kommentar
  • Beste Lösung

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 von srkonus
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...