tray-park
Goto Top

PowerShell - Verschiedene Mitteilungen in einer Mail-Funktion

Windows Server 2008 R2

Ich möchte mit der PowerShell ein Skript schreiben, mit welchem ich mit Hilfe einer If- Else Abfrage meiner Mail-Funktion verschiedene Werte übergebe.

Hi,

ich überprüfe mit meinem Skript, ob ein Programm ein aktuelles Logfile geschrieben hat.
Das Programm schreibt das Logfile im Format tt.mm.yyyy.log

Mein Skript sieht bisher so aus:
        $Hostname = "Rechner"  
    # SMTP Server IP
        $SMTPHostIP = "0.0.0.0"  
    # Absender E-Mail Adresse
        $Absender = "test@example.com"  
    # Empfänder E-Mail Adresse
        $Empfaenger = "tray@example.com"  
    
# Variablen für Funktion "Status" # 
    # Variablen für das Senden der Software-Log als Anhang
    
        # Datumsdefinition Software-Log 
            $LogFileDatum = get-date -uformat "%d.%m.%Y.log"  
        # Pfad zum Software-Log 
            $LogFilePfad = "d:\Software\$LogFileDatum"  
# ------------------------------------------------------------------------------------------------------------------ #

# Anfang Funktion Status

    function Send-Status($Softwarename)
    {
        $SmtpClient = new-object system.net.mail.smtpClient
        $MailMessage = new-Object system.net.mail.mailmessage
        $att = new-object Net.Mail.Attachment($LogFilePfad)
        $SmtpClient.Host = $SMTPHostIP
        $mailmessage.from = $Absender
        $mailmessage.To.add($Empfaenger)
        $mailmessage.Subject = “$BodyJobInfo$MailMessage.IsBodyHtml = $true
        $mailmessage.Body = "$Software"  
        $mailmessage.Attachments.Add($att)
        $smtpclient.Send($mailmessage)
    }

# Ende Funktion Status
# ------------------------------------------------------------------------------------------------------------------ #

# Status der Software wird gesendet

        if (test-path $LogFilePfad)
		{
            $BodyJobInfo = "OKAY Software funktioniert"  
			write-host "Sende Mail Software-Okay"  
           Send-Status $Software $BodyJobInfo
        }
    
        else
        {
            $BodyJobInfo = "ERROR Software funktioniert nicht"  
            write-host "Sende Mail Software-Nicht-Okay"  
            Send-Status $Software $BodyJobInfo
        }
# ------------------------------------------------------------------------------------------------------------------ #  
Problem ist nun , dass mir die PS einen Fehler ausgibt, wenn das Logfile anders als definiert heißt oder nicht existiert.
New-Object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Die Datei "K:\2ChartaWork\Logs\jobinstest\09.12.20102.log" konnte nicht gefunden werden."  
Bei C:\Users\Administrator\Desktop\2Charta\Funktionen.ps1:37 Zeichen:26
+         $att = new-object <<<<  Net.Mail.Attachment($JobDateiPfad)
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
 
Ausnahme beim Aufrufen von "Add" mit 1 Argument(en):  "Der Wert darf nicht NULL sein.  
Parametername: item"  
Bei C:\Users\Administrator\Desktop\2Charta\Funktionen.ps1:44 Zeichen:37
+         $mailmessage.Attachments.Add <<<< ($att)
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
Was mache ich hier falsch?

Freue mich auf jede Antwort.

Grüße


Tray

Content-Key: 156629

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Miyamoto
Miyamoto Dec 09, 2010 at 09:20:46 (UTC)
Goto Top
Hi,
das Problem ist folgendes:
Du versuchst eine Datei zu versenden die nicht existiert.
Du kannst folgendes machen, einfach eine IF Bedingung in deine "Send-Status" Funktion, den müsste es funktionieren.
# ------------------------------------------------------------------------------------------------------------------ #

# Anfang Funktion Status

    function Send-Status($Softwarename)
    {
        $SmtpClient = new-object system.net.mail.smtpClient
        $MailMessage = new-Object system.net.mail.mailmessage
        if (test-path $LogFilePfad)
	{
            $att = new-object Net.Mail.Attachment($LogFilePfad)
        }
        $SmtpClient.Host = $SMTPHostIP
        $mailmessage.from = $Absender
        $mailmessage.To.add($Empfaenger)
        $mailmessage.Subject = “$BodyJobInfo$MailMessage.IsBodyHtml = $true
        $mailmessage.Body = "$Software"  
        $mailmessage.Attachments.Add($att)
        $smtpclient.Send($mailmessage)
    }

# Ende Funktion Status
# ------------------------------------------------------------------------------------------------------------------ #

Gruß Miyamoto
Member: tray-park
tray-park Dec 13, 2010 at 07:10:26 (UTC)
Goto Top
Es kommt die gleiche Fehlermeldung.
Member: Miyamoto
Miyamoto Dec 13, 2010 at 11:12:08 (UTC)
Goto Top
Hi,
versuch das Bitte noch mal:
# ------------------------------------------------------------------------------------------------------------------ #

# Anfang Funktion Status

function Send-Status($Softwarename)
{
    $SmtpClient = new-object system.net.mail.smtpClient
    $MailMessage = new-Object system.net.mail.mailmessage
    if (test-path $LogFilePfad)
    {
        $att = new-object Net.Mail.Attachment($LogFilePfad)
    }
    $SmtpClient.Host = $SMTPHostIP
    $mailmessage.from = $Absender
    $mailmessage.To.add($Empfaenger)
    $mailmessage.Subject = “$BodyJobInfo$MailMessage.IsBodyHtml = $true
    $mailmessage.Body = "$Software"  
    if (test-path $LogFilePfad)
    {
        $mailmessage.Attachments.Add($att)
    }
    $smtpclient.Send($mailmessage)
}

# Ende Funktion Status
# ------------------------------------------------------------------------------------------------------------------ #

Gruß Miyamoto
Member: tray-park
tray-park Dec 14, 2010 at 10:39:19 (UTC)
Goto Top
Cool! danke dir.

Ich hab noch einen else-Zweig untergebracht, damit auch ein anderer Betreff beim Fehlen der Datei angezeigt wird
# ------------------------------------------------------------------------------------------------------------------ #

# Anfang Funktion Status

function Send-Status($Softwarename)
{
    $SmtpClient = new-object system.net.mail.smtpClient
    $MailMessage = new-Object system.net.mail.mailmessage
    if (test-path $LogFilePfad)
    {
        $att = new-object Net.Mail.Attachment($LogFilePfad)
$Subject = "Alles okay"  
    }
else
{
$Subject = "Nichts okay"  
}
    $SmtpClient.Host = $SMTPHostIP
    $mailmessage.from = $Absender
    $mailmessage.To.add($Empfaenger)
    $mailmessage.Subject = “$Subject$MailMessage.IsBodyHtml = $true
    $mailmessage.Body = "$Software"  
    if (test-path $LogFilePfad)
    {
        $mailmessage.Attachments.Add($att)
    }
    $smtpclient.Send($mailmessage)
}

# Ende Funktion Status
# ------------------------------------------------------------------------------------------------------------------ #

Wie kann ich denn eigentlich einer Funktion meherer Werte übergeben?

Ich möchte nämlich, dass statt eines leeren Body´s noch das Ergebnis z.B. eines Pings eingefügt wird. Am besten mit Zeilenumbruch.

So würde ich es bisher machen:
        $ping1 = ping Server 1
	$ping2 = ping Server2
	$ping3 = ping Server3
	
		Write-Host "Sende Status Software"  
		Send-Status $Software $ping1 ping2 ping3
Und dann das Ergebnis in die Funktion übergeben
function Send-Status($Softwarename, $ping1, $ping2, $ping3)
{
    $SmtpClient = new-object system.net.mail.smtpClient
... ...
   $mailmessage.Body = "$ping1 ||  $ping2 || $ping3"  
...
}
Wie man einen Zeilenumbruch macht, weiß ich leider nicht.

Als Ergebnis erhalte ich bloß den ersten Ping.

Grüße
Member: Miyamoto
Miyamoto Dec 14, 2010 at 11:02:05 (UTC)
Goto Top
Hi,
also um eine Funktion mehrere Parameter zu übergeben macht mal folgendes:
function f1 ($p1, $p2)
{
write-host $p1
write-host $p2
}
Der Aufruf der Funktion geschieht dann wie folgt:
f1("Hallo","Welt")  

Einen Zeilenumbruch machst man so:
echo "Hallo `r`n Welt"  

Gruß Miyamoto
Member: tray-park
tray-park Dec 14, 2010 at 11:46:44 (UTC)
Goto Top
Also so?

Funktion
function Send-Status($Softwarename, $ping1, $ping2, $ping3) 
Funktionsaufruf
Send-Status ($Software,"ping Server1","ping Server2","ping Server3")  
Funktion für Mailversand
 $mailmessage.Body =  " $ping1 `r`n $ping2 `r`n $ping3"  
Gruß
Tray
Member: Miyamoto
Miyamoto Dec 14, 2010 at 12:32:07 (UTC)
Goto Top
Ja , so müsste es funktionieren.

Gruß Miyamoto
Member: tray-park
tray-park Dec 14, 2010 at 12:57:29 (UTC)
Goto Top
Leider nicht.

Ich schätze es hat im Funktionsaufruf was mit den "" zu tun. Ohne diese wirft die PowerShell mir aber Fehler
Fehlender Ausdruck nach ",".  
...
Grüße
Member: Miyamoto
Miyamoto Dec 15, 2010 at 08:00:14 (UTC)
Goto Top
Hi,
also ich habe es noch mal in einem kleinen versuch nach gebaut.
Also Funktion und Aufruf und so, und bei mir klappt es so Fehler frei:
#Funktion
function Send-Status($Softwarename, $ping1, $ping2, $ping3) {
    Write-Host $Softwarename
    Write-Host $ping1
    Write-Host $ping2
    Write-Host $ping3
    Write-Host 
    Write-Host $Softwarename "`r`n" $ping1 "`r`n" $ping2 "`r`n" $ping3  

}

# Variablen
$Software="notepade"  
$pingServer1="127.0.0.1"  
$pingServer2="localhost"  

#Funktionsaufruf
Send-Status ($Software, $pingServer1, $pingServer2,"192.168.0.1")  

Gruß Miyamoto
Member: tray-park
tray-park Jan 04, 2011 at 12:56:04 (UTC)
Goto Top
Hi,

irgendwas läuft schief bei mir. Wenn ich es so mache wie du, dann ist der Body der Mail leer.

Wenn ich die Variablen in die Funktion einbaue, sagt mir die PowerShell was von einem unerwarteten Token. Lasse ich "`r`n" weg und trenne die Variablen mit einem Komma, bekomme ich nur für den ersten Ping ein Ergebnis.

Bei dem auch nur die erste Zeile des Kommandos. Also "Ping wird ausgeführt für localhost [::1] mit 32 Bytes Daten: Antwort von ::1: Zeit"

Sollte ich die Pings in einem Array unterbringen damit das funktioniert?

Grüße Tray
Member: Miyamoto
Miyamoto Jan 05, 2011 at 08:26:20 (UTC)
Goto Top
Hi,
kannst du mir den mal bitte Posten was du bis jetzt hast.
Damit ich es mir mal anschauen kann.

Gruß Miyamoto
Member: tray-park
tray-park Jan 06, 2011 at 11:05:51 (UTC)
Goto Top
Hi,

danke für die Rückmeldung.
function Send-Status($Softwarename)
{
	$ping1 = ping Server1
	$ping2 = ping localhost
	$ping3 = ping 127.0.0.1
	$ping4 = ping Server4
	
    $SmtpClient = new-object system.net.mail.smtpClient
    $MailMessage = new-Object system.net.mail.mailmessage
	$jobTest = get-date -uformat "%d.%m.%Y.log"  
	$LogFilePfad = d:\Software\$jobTest"  
    if (test-path $LogFilePfad)
    {
        $att = new-object Net.Mail.Attachment($LogFilePfad)
		$Subject = "Alles okay"  
    }
	else
	{
		$Subject = Nichts okay"  
	}
    $SmtpClient.Host = $SMTPHostIP
    $mailmessage.from = $Absender
    $mailmessage.To.add($Empfaenger)
    $mailmessage.Subject = $Subject
    $MailMessage.IsBodyHtml = $true
    $mailmessage.Body = "$ping1, $ping2, $ping3, $ping4"  
    if (test-path $LogFilePfad)
    {
        $mailmessage.Attachments.Add($att)
    }
    $smtpclient.Send($mailmessage)
}
Member: Miyamoto
Miyamoto Jan 06, 2011 at 12:57:46 (UTC)
Goto Top
Hi,
ich habe noch eine Idee, füge mal vor der Zeile 26 folgendes ein:
$mailBody=$ping1+"`r`n"+$ping2+"`r`n"+$ping3+"`r`n"+$ping4  
und ersetze die Zeile 26 mit folgendem:
$mailmessage.Body = $mailBody
Das hat in meinem kleinen versuch geklappt.

Gruß Miyamoto
Member: tray-park
tray-park Feb 02, 2011 at 15:37:48 (UTC)
Goto Top
Hi,

ich habe beim Funktionsaufruf einen Fehler gemacht.

Ich habe nun die Klammern und die Kommas weg gelassen und es funktioniert erst einmal soweit.
Send-Status $Software "ping Server1" "ping Server2" "ping Server3"