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-ID: 156629

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

Ausgedruckt am: 25.11.2024 um 13:11 Uhr

Miyamoto
Miyamoto 09.12.2010 um 10:20:46 Uhr
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
tray-park
tray-park 13.12.2010 um 08:10:26 Uhr
Goto Top
Es kommt die gleiche Fehlermeldung.
Miyamoto
Miyamoto 13.12.2010 um 12:12:08 Uhr
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
tray-park
tray-park 14.12.2010 um 11:39:19 Uhr
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
Miyamoto
Miyamoto 14.12.2010 um 12:02:05 Uhr
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
tray-park
tray-park 14.12.2010 um 12:46:44 Uhr
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
Miyamoto
Miyamoto 14.12.2010 um 13:32:07 Uhr
Goto Top
Ja , so müsste es funktionieren.

Gruß Miyamoto
tray-park
tray-park 14.12.2010 um 13:57:29 Uhr
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
Miyamoto
Miyamoto 15.12.2010 um 09:00:14 Uhr
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
tray-park
tray-park 04.01.2011 um 13:56:04 Uhr
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
Miyamoto
Miyamoto 05.01.2011 um 09:26:20 Uhr
Goto Top
Hi,
kannst du mir den mal bitte Posten was du bis jetzt hast.
Damit ich es mir mal anschauen kann.

Gruß Miyamoto
tray-park
tray-park 06.01.2011 um 12:05:51 Uhr
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)
}
Miyamoto
Miyamoto 06.01.2011 um 13:57:46 Uhr
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
tray-park
tray-park 02.02.2011 um 16:37:48 Uhr
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"