Jump to content

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


Go to solution Solved by srkonus,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Recommended Posts

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 to comment

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 to comment

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 to comment

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
Edited by MurdocX
Link to comment
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.

Edited by srkonus
Link to comment

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".

Edited by massaraksch
Link to comment
  • Solution

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.

Edited by srkonus
Link to comment
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...