mguenth83
Goto Top

Textdatei als Body in Send-MailMessage

Hi,
ich versuche gerade ein Powershellscript zu entwerfen das folgendes macht.

Starte die Backupsoftware Snapshot und sichere G: -> gebe den Output in eine Datei error.txt --> Sende eine E-Mail mit der error.txt als Body an einen Empfänger...

Ich habe es mittlerweile soweit das er die Sicherung macht und den Status in eine Textdatei schickt, nur leider weiss ich nicht wie ich den Inhalt der Textdatei als Body in Send-Mailmessage rein bekomme.

Die Mail sollte dann so ankommen

Betreff: Backup

Body: Inhalt der Textdatei (error.txt)
________

Hier mein fertig fast fertiges Powershellscript

Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\psk
ripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\error.txt | Send-MailMessage -To "test1@googlemail
.com" -From "test2@googlemail.com" -Subject Backup -SmtpServer 2003sbs


Hoffentlich kann mir jemand helfen und so erklären das ich es auch raffe face-wink muss dazusagen bin ein blutiger Anfänger in Powershell

Gruß
Matthias

Content-ID: 183477

Url: https://administrator.de/contentid/183477

Ausgedruckt am: 17.11.2024 um 03:11 Uhr

mak-xxl
mak-xxl 13.04.2012 um 10:17:38 Uhr
Goto Top
Moin Matthias,

die Option heißt '-Body' siehe dazu hier.

Aber: '-Body' erwartet einen String mit dem Dateiinhalt - Du musst also die Datei vorher in einen solchen einlesen, etwa so:

$datei = Get-content X:\Verzeichnis\datei.txt

Alternativ kannst Du die Option '-Attachments' verwenden, die erwartet Pfad+Dateiname (als String).

Bitte benutze beim Posten (auch nachträglich) die -Tags.

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 08:52:25 Uhr
Goto Top
Hi,
habs mal versuche aber irgendwie bin ich da nicht weiter gekommen, kannst du es nochmal für echt doofe erklären wie genau das funktioniert ?
Habe mittlerweile raus gefunden das deine Zeile als eigenständiger Befehl ausgeführt werden muss und dannach muss man ja noch irgendwie bei -body die eingelesene Datei angeben oder ?

Achso und was noch schön wär wenn ich in die -Subject Zeile noch das aktuelle Datum einfügen kann.

Habe das ganze mit
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject Backup vom $Date -SmtpServer 2003sbs
probiert aber das mag er nicht.
mak-xxl
mak-xxl 16.04.2012 um 10:36:45 Uhr
Goto Top
Moin Matthias,

Wenn Du einem Parameter einen String mit Leerzeichen übergeben willst, muss der String in Literale gesetzt werden, etwa so:

-Subject "Backup vom heutigen Tage"

Soll zusätzlich zum String noch eine Variable übergeben werden, so muss diese zunächst gesetzt werden, etwa so:

$bdatum = get-date -DisplayHint date 
Infos zu Datumsfunktionen

Anschließend wird das Ganze verknüpft, etwa so:

-Subject "Backup vom $bdatum"

Das Gesamtkonstrukt könnte dann etwa so aussehen:
$datei = Get-content X:\Verzeichnis\datei.txt
$bdatum = get-date -DisplayHint date
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backup vom $bdatum" -Body $datei -smtpServer "siehe nächste Erläuterung"  

Zum SMTP-Server: Der Standardwert steht in der Variable '$PSEmailServer', wenn diese Variable leer ist, dann etwa so:

-smtpServer smtp.googlemail.com

Bitte benutze beim Posten (auch nachträglich) die -Tags.

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 12:41:31 Uhr
Goto Top
Hi,

also danke erstmal für deine Hilfe, ohne Dich wär ich aufgeschmissen....

Mein Script sieht bis jetzt so aus...
Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\pskripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\status.txt
Select-String -Path C:\Users\mguenth\Downloads\status.txt -Pattern "successfully" -OutVariable +snasucc  
Select-String -Path C:\Users\mguenth\Downloads\status.txt -Pattern "error" -OutVariable +snaerr  
$bdatum = get-date -DisplayHint date
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum" -Body "$snasucc,$snaerr" -SmtpServer 2003sbs  



Leider spuckt er mir als body nur das komma aus.

Eiegentlich sollte er die beiden Werte ausgeben.

Sprich er soll einfach nur gucken ob ein Successfull oder ein Error steht und wenn eins von beiden vorhanden ist soll er dies ins Body schreiben..

Ganz schön Haarig die Sache
mak-xxl
mak-xxl 16.04.2012 um 12:48:18 Uhr
Goto Top
Moin Matthias,

Zitat von @mguenth83:
...
Ganz schön Haarig die Sache

Haarig an der Sache wird langsam, dass Du Dich offentsichtlich nicht darum kümmerst, was wohl der Hinweis
Bitte benutze beim Posten (auch nachträglich) die -Tags.
bezwecken soll.
Also bitte, dann geht es weiter.

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 12:54:47 Uhr
Goto Top
Hi,
tut mir echt leid, muss noch ne Menge lernen. Hoffe die Formatierung ist jetzt richtig ?!
mak-xxl
mak-xxl 16.04.2012 um 13:14:29 Uhr
Goto Top
Moin Matthias,

Zitat von @mguenth83:
Select-String -Path C:\Users\mguenth\Downloads\status.txt -Pattern "successfully" -OutVariable +snasucc


Etwa so (nur eine boolesche Variable zeigt Erfolg oder Misserfolg an):

$backok = Select-String -Path "C:\Users\mguenth\Downloads\status.txt" -Pattern "successfully" -Quiet  

Rest etwa so:

$bdatum = get-date -DisplayHint date
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom  
$bdatum" -Body "Backuperfolg: $backok" -smtpServer smtp.googlemail.com  

Zu SMTP-Server letzten Post beachten!

Leider spuckt er mir als body nur das komma aus.
Eiegentlich sollte er die beiden Werte ausgeben.

Macht er auch - wenn aber beide Variablen leer sind ...

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 14:27:49 Uhr
Goto Top
Gute Idee Mario,
leider wollte ich das etwas eleganter gestalten sprich, falls die txt nen Error drin hat soll der Text "Backup leider Fehlgeschlagen kommen" und wenn er ein success drin hat soll kommen "Backup erfolgreich abgeschlossen.

Dazu hab ich folgendes geschrieben:
Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\pskripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\status.txt

Select-String -Path C:\Users\mguenth\Downloads\status.txt -Quiet "successfully" -OutVariable +snasucc  
Select-String -Path C:\Users\mguenth\Downloads\status.txt -Quiet "error" -OutVariable +snaerr  
$bdatum = get-date -DisplayHint date

If ($snasucc -eq "True") {Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum" -Body "Backup erfolgreich durchgeführt" -SmtpServer 2003sbs}  
if ($snaerr -eq "True") {Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum" -Body "Backup leider Fehlgeschlagen" -SmtpServer 2003sbs}  

Komischerweiße wenn ich dies ausführe schickt er mir zwei mal eine E-Mail, obwohl der eine Wert True ist und der andere false.

Falls das irgendwie nicht geht muss ich deine Variante nehmen.

Gruß
Matze
mak-xxl
mak-xxl 16.04.2012 um 14:46:00 Uhr
Goto Top
Moin Matthias,

Zitat von @mguenth83:
Gute Idee Mario,

Ok, wenn es mir jetzt in die Nase regnet ...

leider wollte ich das etwas eleganter gestalten sprich, falls die txt nen Error drin hat soll der Text "Backup leider
Fehlgeschlagen kommen" und wenn er ein success drin hat soll kommen "Backup erfolgreich abgeschlossen.

Der von Dir gewünschten Eleganz steht, wenn Du ein wenig darüber nachdenkst, nur eine Variable wirklich nicht im Weg.

Komischerweiße wenn ich dies ausführe schickt er mir zwei mal eine E-Mail, obwohl der eine Wert True ist und der andere false.

Naja, bei dem Vergleich würde ich als Powershell auch immer eine Mail schicken ... face-wink

Etwa so (mit Link dazu):
if ($backok) 
{$btext = "Backup war erfolgreich!"}   
else 
{$btext = "Backup fehlgeschlagen!"}  

Im Mailversand die Zeile mit dem 'Body' anpassen, etwa so:

-Body $btext

Den Hinweis auf den SMTP-Server erspa ...

Falls das irgendwie nicht geht muss ich deine Variante nehmen.

Musst Du nicht, aber dann alles andere richtig machen ...

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 15:56:59 Uhr
Goto Top
Hi,
ich weiss auch nicht was ich falsch mache. Kann sein das ich noch net so ganz raff wie das ganze alles zusammenhängt bzw welchen Befehl ich wo benutzen muss. Jedenfalls gibt er mir ne Fehlermeldung zurück wenn ich das so hinschreibe.


Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\pskripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\status.txt
Wait-Process -Name snapshot

$bdatum = get-date -DisplayHint date
$backok = Select-String -Path "C:\Users\mguenth\Downloads\status.txt" -Pattern "success" -Quiet  

if ($backok) 
{$btext = "Backup war erfolgreich!"}   
[else
{$btext = "Backup fehlgeschlagen!}]  

Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum" -Body $btext -SmtpServer 2003sbs  

FehlerCode:
Der Zeichenfolge, beginnend mit:
Bei Zeile:12 Zeichen:108
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum <<<< " -Body $btext -SmtpServer 2003sbs
fehlt der Terminator: ".
At line:12 char:142

Fehlende schließende "}" im Anweisungsblock.
At line:12 char:142

Ich kann den Fehler einfach nicht finden, denke ich bin heute Blind


Achso ich hab noch die Powershell 1.0 falls das was ausmacht
mak-xxl
mak-xxl 16.04.2012 um 16:10:57 Uhr
Goto Top
Moin Matthias,

da haben sich Format-Klammern '' eingeschlichen, also so:

Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\pskripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\status.txt 

Wait-Process -Name snapshot 
 
$bdatum = get-date -DisplayHint date 
$backok = Select-String -Path "C:\Users\mguenth\Downloads\status.txt" -Pattern "success" -Quiet   
 
if ($backok)  
{$btext = "Backup war erfolgreich!"}    
else 
{$btext = "Backup fehlgeschlagen!"}  
Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum" -Body $btext -SmtpServer 2003sbs  

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 16:46:09 Uhr
Goto Top
Sage immer noch das gleiche, ich glaub ich hab was kaputt gemacht.

Hier der Fehler:
Der Zeichenfolge, beginnend mit:
Bei Zeile:12 Zeichen:108
+Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backupstatus vom $bdatum <<<< " -Body $btext -SmtpServer 2003sbs
fehlt der Terminator: ".
At line:12 char:142

Fehlende schließende "}" im Anweisungsblock.
At line:12 char:142
mak-xxl
mak-xxl 16.04.2012 um 16:49:45 Uhr
Goto Top
Moin Matthias,

poste oder kontrolliere bitte nochmals Dein Script nach o.a. Vorgabe, da fehlt irgendwo ein schließendes Literal.

Und:

... Achso ich hab noch die Powershell 1.0 falls das was ausmacht

Nur soviel: 'Send-MailMessage' erzeugt in der Version einen Fehler, weil nicht vorhanden ...

Zum Testen die mailende Zeile auskommentieren und ein beherztes:
write $btext
stattdessen geschrieben - anschließend testen.

Nebenbei, aber mit unverminderter Aufmerksamkeit: Links zum Lesen und freuen und schließlich zum laden der Version 2.0 für OS > 2003++ oder hier für XP.

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 16.04.2012 um 22:33:00 Uhr
Goto Top
Habe es gerade geprüft, habe doch die Powershell 2.0 die Links sind schonmal interessant ud habe Sie auch gleich abgespeichert.

Sorry Mario das ich so schnell Antworte face-wink das sollte nicht so rüber kommen als wenn ich Rumbrüllen wurde. Ich denk nur immer, um so schneller ich zurück schreibe um so schneller bekomme ich wieder ne Antwort ^^

Also habs nochmal überprüft, irgendwie hat er ein Problem mit dem IF habe alle 3 Zeillen auskommentiert und den write Befehl rein geschrieben...sieht jetzt so aus und damit gehts auch wenn ich $btext = 1 manuell setzte

write $btext

#if ($backok) {$btext = "Backup war erfolgreich!"} 
#else {$btext = "Backup fehlgeschlagen!} 

Gruß
Matze
mak-xxl
mak-xxl 17.04.2012 um 07:28:58 Uhr
Goto Top
Moin Matthias,

Zitat von @mguenth83:
Sorry Mario das ich so schnell Antworte face-wink das sollte nicht so rüber kommen als wenn ich Rumbrüllen wurde. Ich denk nur
immer, um so schneller ich zurück schreibe um so schneller bekomme ich wieder ne Antwort ^^

Nein, mein 'Schrei nicht so ...' bezog sich auf die von Dir als Überschrift und zusätzlich fett formatierte Fehlerausgabe - in den meisten Foren bedeutet GROßSCHREIBUNG = Schreien.
Dass Du schnell antwortest, finde ich sehr gut - da weiß man noch, um was es ging - und hat es nicht im Alltagsgeschäft schon wieder vergessen.

Also habs nochmal überprüft, irgendwie hat er ein Problem mit dem IF habe alle 3 Zeillen auskommentiert und den write Befehl rein geschrieben
...sieht jetzt so aus und damit gehts auch wenn ich $btext = 1 manuell setzte
> write $btext

Die Zeile kann hier noch nichts ausgeben, weil die Variable noch nicht gesetzt, also leer ist ...

> #if ($backok) {$btext = "Backup war erfolgreich!"}
> #else {$btext = "Backup fehlgeschlagen!} 

Und hier liegt der Hase im Pfeffer - hinter '... fehlgeschlagen!' fehlt ein Literal. Also so:

if ($backok) {$btext = "Backup war erfolgreich!"}
else {$btext = "Backup fehlgeschlagen!"}
write $btext

Wenn übrigens jetzt alles stimmt im Script, darf auch mit aktiver 'Send-MailMessage'-Zeile keine weitere Fehlermeldung kommen - außer der, die auf ein fehlendes Cmd-Let verweist ...

Und noch einen Tipp: Setze auch alle Pfade in Literale, falls Du einen solchen mit Leerzeichen einträgst, geht die Fehlersuche von vorn los ...

Freundliche Grüße von der Insel - Mario
mguenth83
mguenth83 17.04.2012 um 10:28:11 Uhr
Goto Top
Hi,
stimmt, hat sich ein Fehler eingeschlichen, hab jetzt " gesetzt hinter Backup fehlgeschlagen! und schon ging es...

Hier nochmal das ganze Script falls es jemand benutzen will:

Start-Process -Filepath C:\Users\mguenth\Downloads\snapshot.exe -ArgumentList G:, \\matthias\pskripte\test.sna -RedirectStandardOutput C:\Users\mguenth\Downloads\status.txt

Wait-Process -Name snapshot

$bdatum = get-date -DisplayHint date
$backok = Select-String -Path "C:\Users\mguenth\Downloads\status.txt" -Pattern "success" -Quiet  

write $btext

if ($backok) {$btext = "Backup war erfolgreich!"}  
else {$btext = "Backup Fehlgeschlagen, bitte kontaktieren Sie die Firma Test1 unter der Telnr: 000-0000"}  

Send-MailMessage -To "test1@googlemail.com" -From "test2@googlemail.com" -Subject "Backup vom $bdatum" -BodyAsHtml "$btext" -SmtpServer 2003sbs  

Danke für die Hilfe
Gruß
Matze