an-wei
Goto Top

Aufgaben zusammenfassen und mittels Schleife verarbeiten

Hallo zusammen,

ich habe ein PowerShell Script erstellt, welches mittels robocopy Dateien überprüft und diese dann in diverse Ordner verschiebt.
Ist der Ordner in den verschoben werden soll, nicht vorhanden wird dieser erstellt und es werden sg. Basisdateien in den Ordner kopiert. Anschliessend verrichtet robocopy seine Arbeit. Das passt alles.
Anschliessend soll das Ergebniss, welches robocopy zurückgibt (Ok bzw. Fehler) per eMail versendet werden. Da es 8 Aufgaben zum Abarbeiten werden 8 eMail versendet. Das passt auch soweit.

Beim Versand per eMail habe ich diesen Beitrag von @colinardo gefunden und habe mich die Lösung eingebunden.

Kann man die jeweiligen Aufgaben und den Versand per eMail zusammenfassen? Es soll zum nur noch eine eMail versendet werden, in der alle Informationen enthalten sind. Gibt es eine Möglichkeit das ganze mittels einer Schleife zu realisieren, gerade was den Versand per eMail angeht?

 
#  ---  datum formatieren  ---
$JAHR = get-date -Format 'yyyy'  
$MONAT = get-date -format 'MM' ((get-date).addmonths(-1))  
$TAG = get-date -Format 'dd'  
$DATUM = get-date -Format 'yyyyMMdd'  
$ZEIT = get-date -Format 'hhmmss'  
$VORMONAT = get-date -format 'yyyy_MM'  ((get-date).addmonths(-1))  
$LOGZEIT = get-date -Format 'hhmmss'  

# basispfade
$PATH_BASIS1 = 'D:\Firma\Ablage1'  
$PATH_BASIS2 = 'F:\Firma\Ablage2'  

# ordner test1
$PATH_Q_TEST1_IN = "$PATH_BASIS1\Ablage_A"  
$PATH_Q_TEST1_OUT = "$PATH_Q_TEST1_IN\Gesendet_von_Transfer\"  
$PATH_Z_TEST1_IN = "$PATH_Q_TEST1_IN\$JAHR\Empfangen_$JAHR\Empfangen_$VORMONAT\"  
$PATH_Z_TEST1_OUT = "$PATH_Q_TEST1_IN\$JAHR\Gesendet_$JAHR\Gesendet_$VORMONAT\"  

# ordner test2
$PATH_Q_TEST2_IN = "$PATH_BASIS1\Ablage_B"  
$PATH_Q_TEST2_OUT = "$PATH_Q_TEST2_IN\Gesendet_von_EDAP\"  
$PATH_Z_TEST2_IN = "$PATH_Q_TEST2_IN\$JAHR\Empfangen_$JAHR\Empfangen_$VORMONAT\"  
$PATH_Z_TEST2_OUT = "$PATH_Q_TEST2_IN\$JAHR\Gesendet_$JAHR\Gesendet_$VORMONAT\"  

# ordner test3
$PATH_Q_TEST3_IN = "$PATH_BASIS2\Ablage_C"  
$PATH_Q_TEST3_OUT = "$PATH_Q_TEST3_IN\Gesendet _von_EDAP\"  
$PATH_Z_TEST3_IN = "$PATH_Q_TEST3_IN\$JAHR\Empfangen_$JAHR\Empfangen_$VORMONAT\"  
$PATH_Z_TEST3_OUT = "$PATH_Q_TEST3_IN\$JAHR\Gesendet_$JAHR\Gesendet_$VORMONAT\"  

# ordner test4
$PATH_Q_TEST4_IN = "$PATH_BASIS2\Ablage_D"  
$PATH_Q_TEST4_OUT = "$PATH_Q_TEST4_IN\Gesendet_von_EDAP\"  
$PATH_Z_TEST4_IN = "$PATH_Q_TEST4_IN\$JAHR\Empfangen_$JAHR\Empfangen_$VORMONAT\"  
$PATH_Z_TEST4_OUT = "$PATH_Q_TEST4_IN\$JAHR\Gesendet_$JAHR\Gesendet_$VORMONAT\"  

# basisfiles
$BASISFILES = "C:\Tools\basisfiles\*.*"  

# logs
$LOG = "C:\Logs"  
$LOGBASIS1 = "$LOG\Ablage1\$JAHR\$MONAT\$TAG"  
$LOGBASIS2 = "$LOG\Ablage2\$JAHR\$MONAT\$TAG"  

#  ===  logfile ordner  ===
# log-ordner prüfen: vorhanden ja/nein > wenn nein: dann erstellen  ---
if(!(Test-Path $LOGBASIS1)){md $LOGBASIS1 | out-null}
if(!(Test-Path $LOGBASIS2)){md $LOGBASIS2 | out-null}

# ===  Ablage_A  ===
if(!(Test-Path $PATH_Z_TEST1_IN)){md $PATH_Z_TEST1_IN | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST1_IN
robocopy $PATH_Q_TEST1_IN $PATH_Z_TEST1_IN /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS1\Ablage_A_IN.log  

if(!(Test-Path $PATH_Z_TEST1_OUT)){md $PATH_Z_TEST1_OUT | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST1_OUT
robocopy $PATH_Q_TEST1_OUT $PATH_Z_TEST1_OUT /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS1\Ablage_A_OUT.log  

# ===  Ablage_B  ===
if(!(Test-Path $PATH_Z_TEST2_IN)){md $PATH_Z_TEST2_IN | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST2_IN
robocopy $PATH_Q_TEST2_IN $PATH_Z_TEST2_IN /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS1\Ablage_B_IN.log  

if(!(Test-Path $PATH_Z_TEST2_OUT)){md $PATH_Z_TEST2_OUT | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST2_OUT
robocopy $PATH_Q_TEST2_OUT $PATH_Z_TEST2_OUT /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS1\Ablage_B_OUT.log  

# ===  Ablage_C  ===
if(!(Test-Path $PATH_Z_TEST3_IN)){md $PATH_Z_TEST3_IN | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST3_IN
robocopy $PATH_Q_TEST3_IN $PATH_Z_TEST3_IN /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS2\Ablage_C_IN.log  

if(!(Test-Path $PATH_Z_TEST3_OUT)){md $PATH_Z_TEST3_OUT | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST3_OUT
robocopy $PATH_Q_TEST3_OUT $PATH_Z_TEST3_OUT /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS2\Ablage_C_OUT.log  

# ===  Ablage_D  ===
if(!(Test-Path $PATH_Z_TEST4_IN)){md $PATH_Z_TEST4_IN | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST4_IN
robocopy $PATH_Q_TEST4_IN $PATH_Z_TEST4_IN /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS2\Ablage_D_IN.log  

if(!(Test-Path $PATH_Z_TEST4_OUT)){md $PATH_Z_TEST4_OUT | out-null}
Copy-Item $BASISFILES $PATH_Z_TEST4_OUT
robocopy $PATH_Q_TEST4_OUT $PATH_Z_TEST4_OUT /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS2\Ablage_D_OUT.log  

################################################################################
#	script-quelle
#	[content:251289]
################################################################################

# ===  eMail Versand  ===
# Variablen
$mailSMTP = 'mailserver'  
$mailFROM = 'monitoring@firma.de'  

$mailTO = 'empfaenger@firma.de'  
$mailSUBJECT = 'Archivierung Ablage1 und Ablage2'  
$mailDateTime = (Get-Date).ToString("dd.MM.yyyy - hh:mm") + ' Uhr'  

#  ---  HTML-Mail-Body  ---
$mailBODY = @()
$mailBODY = '<font face="Verdana">'  
$mailBODY += '******************<br>'  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Gestartet:|Quelle :|Ziel :|Optionen: <br>' }  
$mailBODY += '- <br>'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Der Prozess <br>'}  
$mailBODY += '- <br>'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Insgesamt|Verzeich\.:|Dateien:|Bytes: <br>'}  
$mailBODY += '- <br>'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Zeiten:|Beendet: <br>'}  
$mailBODY += '******************<br><br>'  
$mailBODY += 'Mail erzeugt am: ' + $mailDateTime + '<br>'   
$mailBODY += '</font><br>'   
$mailBody = $mailBODY | out-string

# Exit-Code von Robocopy speichern
$ROBOCOPY_ERRORCODE = $LASTEXITCODE
# Fehlerlisten-Array von Robocopy
$ROBOCOPY_ERRORLIST = @('-- Nothing to do --','Copy successful','Extrafiles deleted','Copy successful & EXTRA Files deleted','MISMATCHES','OKCOPY + MISMATCHES','MISMATCHES + XTRA','OKCOPY + MISMATCHES + XTRA','FAILED COPIES','OKCOPY + FAIL','FAIL + XTRA','OKCOPY + FAIL + XTRA','FAIL + MISMATCHES','OKCOPY + FAIL + MISMATCHES','FAIL + MISMATCHES + XTRA','OKCOPY + FAIL + MISMATCHES + XTRA','FATAL ERROR')  
# Mail Betreff setzen
$mailSUBJECT = $ROBOCOPY_ERRORLIST[$ROBOCOPY_ERRORCODE]

# Mails verschicken
if ($ROBOCOPY_ERRORCODE -le 1){
	write-host  "Robocopy war erfolgreich, versende Zusammenfassungen via Mail..." -ForegroundColor Green  
	Send-MailMessage -From $mailFROM -To $mailTO -Subject $mailSUBJECT -Body $mailBODY -BodyAsHtml -SmtpServer $mailSMTP -Encoding ([System.Text.Encoding]::UTF8)
	}else{
	write-host "Robocopy hat Fehler gemeldet, Versende Mail mit Logfile ..." -ForegroundColor RED  
	Send-MailMessage -from $mailFROM -To $mailTO -Subject $mailSUBJECT -Body $mailBODY -BodyAsHtml -SmtpServer $mailSMTP -Attachments $pathLogfile  -Encoding ([System.Text.Encoding]::UTF8)
	}

Vielen Dank fürs anschauen.

Gruß André

Content-Key: 288779

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

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

Member: jthuemmler
jthuemmler Nov 19, 2015 at 09:31:46 (UTC)
Goto Top
So ganz verstehe ich das Problem nicht. Du hast doch die Logs einzeln. Wenn Du zum Schluss nur wissen willst, ob ein robocopy-Lauf fehlerhaft war, kannst Du das auch so machen, dass Du bei Fehlern nach jedem Lauf testest und im Fehlerfalle einen gemeinsamen Fehlercode aufaddierst und zwar für jeden Lauf mit 2**n, also Fehler im ersten Lauf: $EC+=1, im 2. Lauf $EC+=2, im 3. Lauf $EC+=4 usw., dann kannst Du hinterher aus $EC ermitteln ob ($EC>0) und welche (($EC && 1|2|4|8...)>0) robocopy-Läufe fehlerhaft waren und dann die Mail zusammenbauen.
Genauso gut kannst Du doch die robocopy-LASTEXITCODEs selbst in ein Array packen und dann am Ende entsprechend verwenden.

Jörg
Member: an-wei
an-wei Nov 19, 2015, updated at Nov 20, 2015 at 06:10:04 (UTC)
Goto Top
Hallo Jörg,

vielen Dank für Deine Antwort.
Aber jetzt meine Frage, wie mache ich das...?

Diese Art und Weise der "Zusammenfassung" ist mir nicht wirklich geläufig; oder anders ausgedrückt - ich weis nicht wie es geht.

André
Member: jthuemmler
jthuemmler Nov 20, 2015 at 12:21:51 (UTC)
Goto Top
Hi,

also, um es richtig zu verstehen, Du willst zum Schluss eine Mail senden, die über jeden Lauf berichtet und die bei Fehlern etwas anders aussieht, als wenn alles OK war und vom jeweiligen Fehlerlauf das Log anhängt?

Was hindert Dich, $mailBODY mit jedem einzelnen Lauf zu belegen und außerdem $rcA...H für Deine 8 Läufe mit den Errorcodes der robocopys zu belegen? Nachher fragst Du $rcA+$rcB+$rcC+$rcD... ab, ob es >0 ist (mindestens ein Fehler ist aufgetreten) damit modifizierst Du das Subjekt der Mail und dann fragst Du alle $rcA...H einzeln ab, und welches !=0 ist, dafür ermittelst Du den Fehlernamen aus $ROBOCOPY_ERRORLIST[$rcA...H], machst noch eine Textzeile damit und hängst den entsprechenden Anhang an. Dann schickst Du die Mail so wie im letzten Codeteil weg...

Also in etwa
# hier erstmal Deine ganzen Pfade etc.
# ===  eMail Versand  === 
# Variablen 
$mailSMTP = 'mailserver'  
$mailFROM = 'monitoring@firma.de'   
$mailTO = 'empfaenger@firma.de'   
$mailSUBJECT = 'Archivierung Ablage1 und Ablage2'   
$mailDateTime = (Get-Date).ToString("dd.MM.yyyy - hh:mm") + ' Uhr'   
#  ---  HTML-Mail-Body  --- 
$mailBODY = @() 
$mailBODY = '<font face="Verdana">'   
$mailBODY += '******************<br>'   
# ===  Ablage_A  === 
if(!(Test-Path $PATH_Z_TEST1_IN)){md $PATH_Z_TEST1_IN | out-null} 
Copy-Item $BASISFILES $PATH_Z_TEST1_IN 
robocopy $PATH_Q_TEST1_IN $PATH_Z_TEST1_IN /MOV /R:2 /W:10 /IF "*.msg" /V /MINAGE:$DATUM /LOG:$LOGBASIS1\Ablage_A_IN.log  
$rcA=%ERRORLEVEL%   # heisst das noch so in PS?
# usw. für alle 8...
# dann testen
$Anhang=""  
if (($rcA+$rcB+$rcC+$rcD...) >0) {  
  $mailSUBJECT += ' mit FEHLERN'    
  # das für alle A...H
  if ($rcA >0) {
    $mailBODY += '"Wegen eines Fehlers wird Logdatei $LOGBASIS1\Ablage_A_IN.log angefügt."  
    $Anhang+="$LOGBASIS1\Ablage_A_IN.log, "  
    }
  write-host "Robocopy hat Fehler gemeldet, Versende Mail mit Logfile ..." -ForegroundColor RED   
  Send-MailMessage -from $mailFROM -To $mailTO -Subject $mailSUBJECT -Body $mailBODY -BodyAsHtml -SmtpServer $mailSMTP -Attachments "$Anhang"  -Encoding ([System.Text.Encoding]::UTF8)  
  }
else { 
  $mailSUBJECT += ' fehlerfrei'  
 	write-host  "Robocopy war erfolgreich, versende Zusammenfassungen via Mail..." -ForegroundColor Green   
	Send-MailMessage -From $mailFROM -To $mailTO -Subject $mailSUBJECT -Body $mailBODY -BodyAsHtml -SmtpServer $mailSMTP -Encoding ([System.Text.Encoding]::UTF8) 
   }
Kann man kompakter , z.B. mit Arrays haben, aber so siehst Du vielleicht besser, was gemeint ist. Bitte unbedingt noch mal prüfen, weil ich gemeinhin mit Powershell nix zu tun hab, bin mir bzgl. des Zusammensetzen von $Anhang nicht sicher, wie die Notation bei Send-MailMessage ist, musst Du mal nachsehen... sinnvoll ist auch, wenn alle Lognamen Variablen sind, ich weiß nämlich nicht genau, was aus "$LOGBASIS1\Ablage_A_IN.log" wird (ob er $LOGBASIS1 dann auch durch den Wert ersetzt, bei Linux-Shell ist es so, in Hochkomma=keine Ersetzung, in Anführungszeichen=wird ersetzt...)

Jörg