PowerShell, Log Datei auslesen, bei Änderungen E-Mail senden
Hallo zusammen,
mein Vorhaben mit Power Shell…
Mit Robocopy, 2 Ordner vergleichen. Danach soll das Log File ausgelesen werden und bei Änderungen automatisch ein E-Mail versendet werden.
Was ich bi jetzt habe.
Robocopy funktioniert.
E-Mail versenden geht auch.
Wo ich noch Hilfe benötige ist wie mache ich das die Log File ausgelesen wird und nur bei Änderungen eine E-Mail versendet wird.
$SourceFolder = "C:\Test\Original"
$DestinationFolder = "C:\Test\Ziel"
$Logfile = "C:\Test\Ziel\log.txt"
$EmailFrom = "swissbull@xxxx.com"
$EmailTo = "swissbull@xxxx.com"
$EmailBody = "Starte Sicherung"
$EmailSubject = "Robocopy Results: Copy Purpose - Location to Location"
$SmtpServer = "smtp-xxx.com"
$SMTPPort = "25"
$Attachment = New-Object Net.Mail.Attachment($Logfile, 'text/plain')
$Message.Attachments.Add($Attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $SMTPPort)
$SMTPClient.Send($Message)
$datei = Get-Content C:\Test\Ziel\log.txt
$a = 0
$datei ¦ ForEach-Object { $a++; "Zeile" + $a + ": " + $_ }
"Gesamtzahl der Zeilen: " + $a
mein Vorhaben mit Power Shell…
Mit Robocopy, 2 Ordner vergleichen. Danach soll das Log File ausgelesen werden und bei Änderungen automatisch ein E-Mail versendet werden.
Was ich bi jetzt habe.
Robocopy funktioniert.
E-Mail versenden geht auch.
Wo ich noch Hilfe benötige ist wie mache ich das die Log File ausgelesen wird und nur bei Änderungen eine E-Mail versendet wird.
$SourceFolder = "C:\Test\Original"
$DestinationFolder = "C:\Test\Ziel"
$Logfile = "C:\Test\Ziel\log.txt"
$EmailFrom = "swissbull@xxxx.com"
$EmailTo = "swissbull@xxxx.com"
$EmailBody = "Starte Sicherung"
$EmailSubject = "Robocopy Results: Copy Purpose - Location to Location"
$SmtpServer = "smtp-xxx.com"
$SMTPPort = "25"
- Change robocopy options as needed.
- Send E-mail message with log file attachment
$Attachment = New-Object Net.Mail.Attachment($Logfile, 'text/plain')
$Message.Attachments.Add($Attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $SMTPPort)
$SMTPClient.Send($Message)
$datei = Get-Content C:\Test\Ziel\log.txt
$a = 0
$datei ¦ ForEach-Object { $a++; "Zeile" + $a + ": " + $_ }
"Gesamtzahl der Zeilen: " + $a
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 317707
Url: https://administrator.de/contentid/317707
Ausgedruckt am: 09.11.2024 um 01:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo swissbull,
ich kann dir zwar nicht so ganz folgen, was du unter einer "Änderung" des Logfiles verstehst, aber aus deinem geposteten Code meine ich zu erkennen, dass du als Grundlage die Anzahl der Zeilen des fraglichen Logfiles heranziehst.
Diese kannst du dir unter Powershell einfach folgendermaßen ausgeben lassen:
Oder zielt deine Frage eher dahin ab wie du einen Mechanismus implementieren könntest, welcher am Ende dauerhaft die Größe des fraglichen Logfiles überwacht?
In diesem Fall wirf mal einen Blick in diesen Artikel hier.
Viele Grüße,
Thorsten
ich kann dir zwar nicht so ganz folgen, was du unter einer "Änderung" des Logfiles verstehst, aber aus deinem geposteten Code meine ich zu erkennen, dass du als Grundlage die Anzahl der Zeilen des fraglichen Logfiles heranziehst.
Diese kannst du dir unter Powershell einfach folgendermaßen ausgeben lassen:
Get-Content <Dateiname> | Measure-Object -Line
Oder zielt deine Frage eher dahin ab wie du einen Mechanismus implementieren könntest, welcher am Ende dauerhaft die Größe des fraglichen Logfiles überwacht?
In diesem Fall wirf mal einen Blick in diesen Artikel hier.
Viele Grüße,
Thorsten
Hallo,
ausgehend davon, dass der von dir gepostete Ausschnitt der gesamte Inhalt des Logfiles ist, also die Zeile beginnend mit "Dateien:" nur einmal vorkommt, könnte dir so etwas weiterhelfen?
Dann ist das von dir unterstrichene Zeichen enthalten. Im folgenden könntest du dann überprüfen, ob dieses einen bestimmten Wert hat.
Viele Grüße,
Thorsten
ausgehend davon, dass der von dir gepostete Ausschnitt der gesamte Inhalt des Logfiles ist, also die Zeile beginnend mit "Dateien:" nur einmal vorkommt, könnte dir so etwas weiterhelfen?
$a = Get-Content <Dateiname> | Select-String 'Dateien:' -SimpleMatch
$a.ToString().Substring(11,1)
Dann ist das von dir unterstrichene Zeichen enthalten. Im folgenden könntest du dann überprüfen, ob dieses einen bestimmten Wert hat.
Viele Grüße,
Thorsten
Ob Dateien kopiert/geändert werden lässt sich auch so ganz einfach mit einem Robocopy-Testlauf ermitteln:
Gruß R.
(robocopy "C:\quelle" "C:\ziel" /S /ZB /L /NS /NC /NJH /NJS /NDL ).length -1
Wieso? , obige Zeile liefert die die Anzahl an Dateien die geändert/kopiert wurden
IF, ELSE, SWITCH: Bedingte Anweisungen in PowerShell
Üble Grundlagen ...
Alles über ein höheren Wert über 0 muss ein E-Mail senden. Wie mache ich das??
Meine Zeile einer Variablen zuweisen und dann per IF testen$changes = (robocopy "C:\quelle" "C:\ziel" /S /ZB /L /NS /NC /NJH /NJS /NDL ).length -1
if ($changes -gt 0){
# mindestens eine Änderung
}else{
# keine Änderung
}
IF, ELSE, SWITCH: Bedingte Anweisungen in PowerShell
Üble Grundlagen ...
Hallo,
Ranger hat in der Tat die einfachere Lösung beschrieben.
Um aber deine Frage zu beantworten:
Wobei dein angegebener Substring schon komisch ist - ich dachte es geht nur um die von dir im obigen Post unterstrichene Position? Also?
Viele Grüße,
Thorsten
Ranger hat in der Tat die einfachere Lösung beschrieben.
Um aber deine Frage zu beantworten:
$a = Get-Content C:\Test\Ziel\log.txt | Select-String 'Dateien:' -SimpleMatch
if ($a.ToString().Substring(21,10) -gt 0)
{
# versende ein Mail
}
Wobei dein angegebener Substring schon komisch ist - ich dachte es geht nur um die von dir im obigen Post unterstrichene Position? Also
$a.ToString().Substring(11,1)
Viele Grüße,
Thorsten
Ich verstehe noch immer nicht, warum dein Substring (21,10) ist.
Oben hast du geschrieben, dass dich bei "Dateien: 4 0 4 0 0 3" nur die unterstrichene Position interessiert. Diese wäre jedoch Substring(11,1), der eben dann nur diese Position beachtet.
Bei deinem Substring(21,10) liest du ja zehn Zeichen aus. Das wird auch für Powershell schwierig zu überprüfen, ob eine zehnstellige Zeichenfolge größer als "0" ist. ;o)
Oben hast du geschrieben, dass dich bei "Dateien: 4 0 4 0 0 3" nur die unterstrichene Position interessiert. Diese wäre jedoch Substring(11,1), der eben dann nur diese Position beachtet.
Bei deinem Substring(21,10) liest du ja zehn Zeichen aus. Das wird auch für Powershell schwierig zu überprüfen, ob eine zehnstellige Zeichenfolge größer als "0" ist. ;o)