Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PowerShell - Verschiedene Mitteilungen in einer Mail-Funktion

Frage Entwicklung Batch & Shell

Mitglied: tray-park

tray-park (Level 1) - Jetzt verbinden

09.12.2010, aktualisiert 09:03 Uhr, 7190 Aufrufe, 14 Kommentare

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:
01.
        $Hostname = "Rechner" 
02.
    # SMTP Server IP 
03.
        $SMTPHostIP = "0.0.0.0" 
04.
    # Absender E-Mail Adresse 
05.
        $Absender = "test@example.com" 
06.
    # Empfänder E-Mail Adresse 
07.
        $Empfaenger = "tray@example.com" 
08.
     
09.
# Variablen für Funktion "Status" # 
10.
    # Variablen für das Senden der Software-Log als Anhang 
11.
     
12.
        # Datumsdefinition Software-Log  
13.
            $LogFileDatum = get-date -uformat "%d.%m.%Y.log" 
14.
        # Pfad zum Software-Log  
15.
            $LogFilePfad = "d:\Software\$LogFileDatum" 
16.
# ------------------------------------------------------------------------------------------------------------------ # 
17.
 
18.
# Anfang Funktion Status 
19.
 
20.
    function Send-Status($Softwarename) 
21.
22.
        $SmtpClient = new-object system.net.mail.smtpClient 
23.
        $MailMessage = new-Object system.net.mail.mailmessage 
24.
        $att = new-object Net.Mail.Attachment($LogFilePfad) 
25.
        $SmtpClient.Host = $SMTPHostIP 
26.
        $mailmessage.from = $Absender 
27.
        $mailmessage.To.add($Empfaenger) 
28.
        $mailmessage.Subject = “$BodyJobInfo” 
29.
        $MailMessage.IsBodyHtml = $true 
30.
        $mailmessage.Body = "$Software" 
31.
        $mailmessage.Attachments.Add($att) 
32.
        $smtpclient.Send($mailmessage) 
33.
34.
 
35.
# Ende Funktion Status 
36.
# ------------------------------------------------------------------------------------------------------------------ # 
37.
 
38.
# Status der Software wird gesendet 
39.
 
40.
        if (test-path $LogFilePfad) 
41.
42.
            $BodyJobInfo = "OKAY Software funktioniert" 
43.
			write-host "Sende Mail Software-Okay" 
44.
           Send-Status $Software $BodyJobInfo 
45.
46.
     
47.
        else 
48.
49.
            $BodyJobInfo = "ERROR Software funktioniert nicht" 
50.
            write-host "Sende Mail Software-Nicht-Okay" 
51.
            Send-Status $Software $BodyJobInfo 
52.
53.
# ------------------------------------------------------------------------------------------------------------------ #  
Problem ist nun , dass mir die PS einen Fehler ausgibt, wenn das Logfile anders als definiert heißt oder nicht existiert.
01.
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." 
02.
Bei C:\Users\Administrator\Desktop\2Charta\Funktionen.ps1:37 Zeichen:26 
03.
+         $att = new-object <<<<  Net.Mail.Attachment($JobDateiPfad) 
04.
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException 
05.
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand 
06.
  
07.
Ausnahme beim Aufrufen von "Add" mit 1 Argument(en):  "Der Wert darf nicht NULL sein. 
08.
Parametername: item" 
09.
Bei C:\Users\Administrator\Desktop\2Charta\Funktionen.ps1:44 Zeichen:37 
10.
+         $mailmessage.Attachments.Add <<<< ($att) 
11.
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException 
12.
    + FullyQualifiedErrorId : DotNetMethodException
Was mache ich hier falsch?

Freue mich auf jede Antwort.

Grüße



Tray
Mitglied: Miyamoto
09.12.2010 um 10:20 Uhr
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.
01.
# ------------------------------------------------------------------------------------------------------------------ # 
02.
 
03.
# Anfang Funktion Status 
04.
 
05.
    function Send-Status($Softwarename) 
06.
07.
        $SmtpClient = new-object system.net.mail.smtpClient 
08.
        $MailMessage = new-Object system.net.mail.mailmessage 
09.
        if (test-path $LogFilePfad) 
10.
11.
            $att = new-object Net.Mail.Attachment($LogFilePfad) 
12.
13.
        $SmtpClient.Host = $SMTPHostIP 
14.
        $mailmessage.from = $Absender 
15.
        $mailmessage.To.add($Empfaenger) 
16.
        $mailmessage.Subject = “$BodyJobInfo” 
17.
        $MailMessage.IsBodyHtml = $true 
18.
        $mailmessage.Body = "$Software" 
19.
        $mailmessage.Attachments.Add($att) 
20.
        $smtpclient.Send($mailmessage) 
21.
22.
 
23.
# Ende Funktion Status 
24.
# ------------------------------------------------------------------------------------------------------------------ #
Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
13.12.2010 um 08:10 Uhr
Es kommt die gleiche Fehlermeldung.
Bitte warten ..
Mitglied: Miyamoto
13.12.2010 um 12:12 Uhr
Hi,
versuch das Bitte noch mal:
01.
# ------------------------------------------------------------------------------------------------------------------ # 
02.
 
03.
# Anfang Funktion Status 
04.
 
05.
function Send-Status($Softwarename) 
06.
07.
    $SmtpClient = new-object system.net.mail.smtpClient 
08.
    $MailMessage = new-Object system.net.mail.mailmessage 
09.
    if (test-path $LogFilePfad) 
10.
11.
        $att = new-object Net.Mail.Attachment($LogFilePfad) 
12.
13.
    $SmtpClient.Host = $SMTPHostIP 
14.
    $mailmessage.from = $Absender 
15.
    $mailmessage.To.add($Empfaenger) 
16.
    $mailmessage.Subject = “$BodyJobInfo” 
17.
    $MailMessage.IsBodyHtml = $true 
18.
    $mailmessage.Body = "$Software" 
19.
    if (test-path $LogFilePfad) 
20.
21.
        $mailmessage.Attachments.Add($att) 
22.
23.
    $smtpclient.Send($mailmessage) 
24.
25.
 
26.
# Ende Funktion Status 
27.
# ------------------------------------------------------------------------------------------------------------------ #
Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
14.12.2010 um 11:39 Uhr
Cool! danke dir.

Ich hab noch einen else-Zweig untergebracht, damit auch ein anderer Betreff beim Fehlen der Datei angezeigt wird
01.
# ------------------------------------------------------------------------------------------------------------------ # 
02.
 
03.
# Anfang Funktion Status 
04.
 
05.
function Send-Status($Softwarename) 
06.
07.
    $SmtpClient = new-object system.net.mail.smtpClient 
08.
    $MailMessage = new-Object system.net.mail.mailmessage 
09.
    if (test-path $LogFilePfad) 
10.
11.
        $att = new-object Net.Mail.Attachment($LogFilePfad) 
12.
$Subject = "Alles okay" 
13.
14.
else 
15.
16.
$Subject = "Nichts okay" 
17.
18.
    $SmtpClient.Host = $SMTPHostIP 
19.
    $mailmessage.from = $Absender 
20.
    $mailmessage.To.add($Empfaenger) 
21.
    $mailmessage.Subject = “$Subject” 
22.
    $MailMessage.IsBodyHtml = $true 
23.
    $mailmessage.Body = "$Software" 
24.
    if (test-path $LogFilePfad) 
25.
26.
        $mailmessage.Attachments.Add($att) 
27.
28.
    $smtpclient.Send($mailmessage) 
29.
30.
 
31.
# Ende Funktion Status 
32.
# ------------------------------------------------------------------------------------------------------------------ #
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:
01.
        $ping1 = ping Server 1 
02.
	$ping2 = ping Server2 
03.
	$ping3 = ping Server3 
04.
	 
05.
		Write-Host "Sende Status Software" 
06.
		Send-Status $Software $ping1 ping2 ping3
Und dann das Ergebnis in die Funktion übergeben
01.
function Send-Status($Softwarename, $ping1, $ping2, $ping3) 
02.
03.
    $SmtpClient = new-object system.net.mail.smtpClient 
04.
... ... 
05.
   $mailmessage.Body = "$ping1 ||  $ping2 || $ping3" 
06.
... 
07.
}
Wie man einen Zeilenumbruch macht, weiß ich leider nicht.

Als Ergebnis erhalte ich bloß den ersten Ping.

Grüße
Bitte warten ..
Mitglied: Miyamoto
14.12.2010 um 12:02 Uhr
Hi,
also um eine Funktion mehrere Parameter zu übergeben macht mal folgendes:
01.
function f1 ($p1, $p2) 
02.
03.
write-host $p1 
04.
write-host $p2 
05.
}
Der Aufruf der Funktion geschieht dann wie folgt:
01.
f1("Hallo","Welt")
Einen Zeilenumbruch machst man so:
01.
echo "Hallo `r`n Welt"
Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
14.12.2010 um 12:46 Uhr
Also so?

Funktion
01.
function Send-Status($Softwarename, $ping1, $ping2, $ping3) 
Funktionsaufruf
01.
Send-Status ($Software,"ping Server1","ping Server2","ping Server3")
Funktion für Mailversand
01.
 $mailmessage.Body =  " $ping1 `r`n $ping2 `r`n $ping3"
Gruß
Tray
Bitte warten ..
Mitglied: Miyamoto
14.12.2010 um 13:32 Uhr
Ja , so müsste es funktionieren.

Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
14.12.2010 um 13:57 Uhr
Leider nicht.

Ich schätze es hat im Funktionsaufruf was mit den "" zu tun. Ohne diese wirft die PowerShell mir aber Fehler
01.
Fehlender Ausdruck nach ",". 
02.
...
Grüße
Bitte warten ..
Mitglied: Miyamoto
15.12.2010 um 09:00 Uhr
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:
01.
#Funktion 
02.
function Send-Status($Softwarename, $ping1, $ping2, $ping3) { 
03.
    Write-Host $Softwarename 
04.
    Write-Host $ping1 
05.
    Write-Host $ping2 
06.
    Write-Host $ping3 
07.
    Write-Host  
08.
    Write-Host $Softwarename "`r`n" $ping1 "`r`n" $ping2 "`r`n" $ping3 
09.
 
10.
11.
 
12.
# Variablen 
13.
$Software="notepade" 
14.
$pingServer1="127.0.0.1" 
15.
$pingServer2="localhost" 
16.
 
17.
#Funktionsaufruf 
18.
Send-Status ($Software, $pingServer1, $pingServer2,"192.168.0.1")
Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
04.01.2011 um 13:56 Uhr
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
Bitte warten ..
Mitglied: Miyamoto
05.01.2011 um 09:26 Uhr
Hi,
kannst du mir den mal bitte Posten was du bis jetzt hast.
Damit ich es mir mal anschauen kann.

Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
06.01.2011 um 12:05 Uhr
Hi,

danke für die Rückmeldung.
01.
function Send-Status($Softwarename) 
02.
03.
	$ping1 = ping Server1 
04.
	$ping2 = ping localhost 
05.
	$ping3 = ping 127.0.0.1 
06.
	$ping4 = ping Server4 
07.
	 
08.
    $SmtpClient = new-object system.net.mail.smtpClient 
09.
    $MailMessage = new-Object system.net.mail.mailmessage 
10.
	$jobTest = get-date -uformat "%d.%m.%Y.log" 
11.
	$LogFilePfad = d:\Software\$jobTest" 
12.
    if (test-path $LogFilePfad) 
13.
14.
        $att = new-object Net.Mail.Attachment($LogFilePfad) 
15.
		$Subject = "Alles okay" 
16.
17.
	else 
18.
19.
		$Subject = Nichts okay" 
20.
21.
    $SmtpClient.Host = $SMTPHostIP 
22.
    $mailmessage.from = $Absender 
23.
    $mailmessage.To.add($Empfaenger) 
24.
    $mailmessage.Subject = $Subject 
25.
    $MailMessage.IsBodyHtml = $true 
26.
    $mailmessage.Body = "$ping1, $ping2, $ping3, $ping4" 
27.
    if (test-path $LogFilePfad) 
28.
29.
        $mailmessage.Attachments.Add($att) 
30.
31.
    $smtpclient.Send($mailmessage) 
32.
}
Bitte warten ..
Mitglied: Miyamoto
06.01.2011 um 13:57 Uhr
Hi,
ich habe noch eine Idee, füge mal vor der Zeile 26 folgendes ein:
01.
$mailBody=$ping1+"`r`n"+$ping2+"`r`n"+$ping3+"`r`n"+$ping4
und ersetze die Zeile 26 mit folgendem:
01.
$mailmessage.Body = $mailBody
Das hat in meinem kleinen versuch geklappt.

Gruß Miyamoto
Bitte warten ..
Mitglied: tray-park
02.02.2011 um 16:37 Uhr
Hi,

ich habe beim Funktionsaufruf einen Fehler gemacht.

Ich habe nun die Klammern und die Kommas weg gelassen und es funktioniert erst einmal soweit.
01.
Send-Status $Software "ping Server1" "ping Server2" "ping Server3"
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst PowerShell, Log Datei auslesen, bei Änderungen E-Mail senden (12)

Frage von swissbull zum Thema Batch & Shell ...

Outlook & Mail
gelöst E-Mail versenden mit PowerShell (6)

Frage von 112Timo zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...