nother
Goto Top

Robocopy Batch mit Mailversand von Blat auf Powershell umbauen

Hallo an alle!
Ich benötige mal wieder Hilfe beim Umbau eines Scripts. Bastla? Derwowußte?
Hintergrund ist der Verzicht auf externen Programmaufruf: Blat muss raus!
Habe schon diverse andere Powershell-Robocopy-Scripte gesehen und getestet, aber die Aufbereitung und die für meinereiner Übersichtliche Struktur dieser Batch möchte ich nicht mehr missen.
Außerdem sind meine Powershell Fähigkeiten sehr begrenzt!
Also geht es konkret um den letzten Abschnitt: Mailversand per Powershell.
Oder jemand ist in der Lage, die gesamte Batch per Powershell umzubauen.
Entscheidend ist für mich die Übersichtlichkeit!


@ECHO OFF & SETLOCAL
::@ECHO OFF
::		------------------ Codepage ändern für Umlaute im Log --------------------
chcp 1252
::		------------------ eventuell alte vorhandene Dateien löschen -------------
if exist temp.txt del temp.txt
if exist logfile.log del logfile.log
::		------------------ allgemeine Variablen: Datum zerlegen ------------------
for /F "tokens=1-3 delims=/. " %%a in ('date/T') do (  
    set "TT=%%a"  
    set "MM=%%b"  
    set "YYYY=%%c"  
)
set "mydate=%YYYY%-%MM%-%TT%"  
::--------------------------------------------------------------------------------
::		------------------ Variablen für den Mailer ------------------------------
::--------------------------------------------------------------------------------
set "mailsrv=Mailserver-Adresse"  
set "mailuser=Mailuser"  
set "mailuserPW=Passwort"  
set "mailfrom=Mailadresse"  
set "pathblat=C:\Program Files (x86)\Blat"  
set "mailto=Wohin"  
set "BCC=Wohin_noch"  
set "body=temp.txt"  
::		------------------ Netzlaufwerk verbinden -----------------
::--------------------------------------------------------------------------------
::net use M:\ 
::--------------------------------------------------------------------------------
::--------------------------------------------------------------------------------
::		------------------ Ab hier werden die Robocopy Parameter befüllt ---------
::		------------------ Variable Quelle ohne abschließendem \ -----------------
::--------------------------------------------------------------------------------
set "quelle=\\Quellpfad"  
::--------------------------------------------------------------------------------
::		------------------ Variable Zielverzeichnis ohne abschließendem \ --------
::--------------------------------------------------------------------------------
set "backuproot=\\Zielpfad"  
::--------------------------------------------------------------------------------
::		------------------ lege ein Monatsordner an ------------------------------
::--------------------------------------------------------------------------------
set "ziel=%BackupRoot%\%MM%\%mydate%"  
::		------------------ Robocopy Parameter 1 ----------------------------------
::		------------------ Was soll kopiert werden -------------------------------
::		------------------ z.B. alle Worddokumente mit *.doc ---------------------
set "what=*.*"  
::		------------------ Robocopy Parameter 2 ----------------------------------
:: set "par=/S /COPY:DAT /FFT /R:1 /W:1 /TS /FP /NDL /TEE /NP /XF desktop.ini Thumbs.db /XD $RECYCLE.BIN" 
::--------------------------------------------------------------------------------
::
:: Auflistung der genutzten und zusätzlich Sinnvollen Ergänzungs-Parameter -------
:: Kopieroptionen:
:: /S :: Kopiert Unterverzeichnisse, jedoch keine leeren Unterverzeichnisse.
:: /COPY:copyflags:: Gibt an, welche Inhalte für Dateien kopiert werden sollen (der Standard ist "/COPY:DAT").  
::                  (Kopierflags : D=Daten, A=Attribute, T=Zeitstempel).
::                  (S=Sicherheit=NTFS-ACLs, O=Besitzerinformationen, U=Überwachungsinformationen).
:: /MIR :: Spiegelt eine Verzeichnisstruktur (Entspricht "/E" mit "/PURGE"). < Achtung bitte Schlau machen! Kann auch Daten im Zielverzeichnis löschen!  
::--------------------------------------------------------------------------------
set "par_copy=/S /COPY:DAT"  
::--------------------------------------------------------------------------------
:: Dateiauswahloptionen:
:: /A :: Kopiert nur Dateien mit dem "Archive"-Attribut.  
:: /M :: Kopiert nur Dateien mit dem "Archive"-Attribut und setzt das Attribut zurück.  
:: /XF Datei[Datei]:: Schließt Dateien aus, die mit den angegebenen Namen/Pfaden/Platzhaltern übereinstimmen.
:: /XD Verz.[Verz.]:: Schließt Verzeichnisse aus, die mit den angegebenen Namen/Pfaden übereinstimmen.
::--------------------------------------------------------------------------------
set "par_exclf=/XF desktop.ini Thumbs.db *.pdf *.dmp"  
set "par_excld=/XD $RECYCLE.BIN Updates Protokolle Install Listen MCP_Archivverzeichnis Kommunik"  
::--------------------------------------------------------------------------------
:: /FFT :: Geht von FAT-Uhrzeitangaben für Dateien aus (Granularität von zwei Sekunden).
set "par_ausw=/FFT"  
::--------------------------------------------------------------------------------
:: Wiederholungsoptionen:
:: /R:n :: Anzahl von Wiederholungsversuchen bei fehlerhaften Kopiervorgängen. Der Standardwert ist 1 Million.
:: /W:n :: Wartezeit zwischen Wiederholungsversuchen. Der Standardwert ist 30 Sekunden.
::--------------------------------------------------------------------------------
set "par_read=/R:1 /W:1"  
::--------------------------------------------------------------------------------
:: Protokollierungsoptionen :
:: /L   :: Listet nur auf. Es werden keine Kopiervorgänge ausgeführt, Zeitstempel erstellt oder Dateien gelöscht.
:: 		:: Diese Option ist besonders Sinnvoll zum Testen!
:: /X   :: Meldet alle zusätzlichen Dateien, nicht nur die ausgewählten Dateien.
:: /V   :: Erstellt eine ausführliche Ausgabe mit ausgelassenen Dateien.
:: /TS  :: Schließt Zeitstempel von Quelldateien in die Ausgabe ein.
:: /FP  :: Schließt den vollständigen Pfadnamen von Dateien in die Ausgabe ein.
:: /NDL :: Keine Verzeichnisliste - Verzeichnisnamen werden nicht protokolliert.
:: /ETA :: Zeigt die ungefähre Empfangszeit der kopierten Dateien an. Sinnvoll im Netzwerk mit >
:: /TEE :: Gibt Daten in das Konsolenfenster und die Protokolldatei aus.
:: /NP  :: Kein Status - der Prozentsatz kopierter Elemente wird nicht angezeigt.
::--------------------------------------------------------------------------------
set "par_prot=/TS /FP /NDL /TEE /NP"  
::--------------------------------------------------------------------------------
::--------------------------------------------------------------------------------
::		------------------ Bis hier werden die Robocopy Parameter befüllt --------
::--------------------------------------------------------------------------------
::		------------------ Logfile für Robocopy ----------------------------------
if not exist %BackupRoot%\Logs mkdir %BackupRoot%\Logs
set "logfile=%BackupRoot%\Logs\%mydate%.log"  
set "log=/LOG:%logfile%"  
::--------------------------------------------------------------------------------
::		------------------ Attribut am 01. des Monats zurücksetzen ---------------
::		------------------ den Parameter /A durch /M ersetzen --------------------
::		------------------ Vollständige Sicherung und Attrib /A raus -------------
::		------------------ Darauffolgende Tage werden differentiell gesichert ----
:: Dateiauswahloptionen:
:: /A  :: Kopiert nur Dateien mit dem "Archive"-Attribut.  
:: /M  :: Kopiert nur Dateien mit dem "Archive"-Attribut und setzt das Attribut zurück.  
:: über die if Abfrage wird am XX des Monats (in diesem Fall am 01.) das Archiv-Attribut neu gesetzt
::--------------------------------------------------------------------------------
if %TT%==01 (
    attrib +a "%quelle%\*.*" /s /d  
    set "par=/M %par%"  
    ping localhost -n 9 >nul
) else (
    set "par=/A %par%"  
)
::--------------------------------------------------------------------------------
::		------------------ Der eigentliche Robocopy-Aufruf -----------------------
::--------------------------------------------------------------------------------
robocopy.exe "%quelle%" "%ziel%" %what% %par% %par_copy% %par_exclf% %par_excld% %par_ausw% %par_read% %par_prot% %log%  
::--------------------------------------------------------------------------------
::		------------------ Errorlevel von Robocopy überprüfen --------------------
set "err=%errorlevel%"  
if %err%==16 set "betreff=FATAL ERROR"  
if %err%==15 set "betreff=OKCOPY + FAIL + MISMATCHES + XTRA"  
if %err%==14 set "betreff=FAIL + MISMATCHES + XTRA"  
if %err%==13 set "betreff=OKCOPY + FAIL + MISMATCHES"  
if %err%==12 set "betreff=FAIL + MISMATCHES"  
if %err%==11 set "betreff=OKCOPY + FAIL + XTRA"  
if %err%==10 set "betreff=FAIL + XTRA"  
if %err%==9  set "betreff=OKCOPY + FAIL"  
if %err%==8  set "betreff=FAILED COPIES"  
if %err%==7  set "betreff=OKCOPY + MISMATCHES + XTRA"  
if %err%==6  set "betreff=MISMATCHES + XTRA"  
if %err%==5  set "betreff=OKCOPY + MISMATCHES"  
if %err%==4  set "betreff=MISMATCHES"  
if %err%==3  set "betreff=Copy successful ^& EXTRA Files deleted"  
if %err%==2  set "betreff=EXTRA Files deleted"  
if %err%==1  set "betreff=Copy successful"  
if %err%==0  set "betreff=-- Nothing to do --"  
::		------------------ Bestimmte Zeilen auslesen -----------------------------
::		------------------ Dieses ist nur für die Mailzusammenfassung ------------
ping localhost -n 5 >nul
find /i "Gestartet:" %Logfile% >> temp.txt  
find /i "Quelle :" %Logfile% >> temp.txt  
find /i "Ziel :" %Logfile% >> temp.txt  
find /i "Optionen:" %Logfile% >> temp.txt  
echo. >> temp.txt
echo ----------------------------------------------------------------------------- >> temp.txt
find /i "Der Prozess" %Logfile% >> temp.txt  
echo ----------------------------------------------------------------------------- >> temp.txt
find /i "Insgesamt" %Logfile% >> temp.txt  
find /i "Verzeich.:" %Logfile% >> temp.txt  
find /i "Dateien:" %Logfile% >> temp.txt  
find /i "Bytes:" %Logfile% >> temp.txt  
echo ----------------------------------------------------------------------------- >> temp.txt
find /i "Zeiten:" %Logfile%  >> temp.txt  
find /i "Beendet:" %Logfile% >> temp.txt  
type temp.txt | find /i /v "%Logfile%" > temp2.txt  
del temp.txt
ren temp2.txt temp.txt
echo. >> temp.txt
echo. >> temp.txt
ping localhost -n 9 >nul
::--------------------------------------------------------------------------------
::		------------------ Bestimmte Zeilen auslesen Ende ------------------------
::--------------------------------------------------------------------------------
::		------------------ Wenn Errorlevel kleiner oder gleich eins, dann --------
if %err% leq 1 (
::		------------------ Mailer1 Zusammenfassung versenden ---------------------
    "%pathblat%\blat.exe" %body% -to %mailto% -bcc %BCC% -server %mailsrv% -debug -timestamp -subject "%betreff%"  
) else (
::		------------------ Mailer2 für Fehler und komplettes Logfile -------------
::		------------------ Wenn Errorlevel größer eins, dann --------
    "%pathblat%\blat.exe" %body% -attach %Logfile% -to %mailto% -bcc %BCC% -server %mailsrv% -debug -timestamp -subject "%betreff%"  
)
::--------------------------------------------------------------------------------
::		------------------ Letzten 5 Versionen behalten, Rest löschen! -----------
::for /f "skip=5" %%i in ('dir /b/o-D/ad/tc "%backuproot%\%MM%\????-??-??"') do rd /s /q "%backuproot%\%MM%\%%i"  
::pause
exit

Content-Key: 251289

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

Printed on: April 16, 2024 at 09:04 o'clock

Member: colinardo
Solution colinardo Oct 12, 2014, updated at Dec 15, 2014 at 14:40:45 (UTC)
Goto Top
Moin nother,
in Powershell umgesetzt und grob angetestet könnte dies so aussehen:
# ---------- VARIABLEN ------------

$PATH_QUELLE = 'C:\Quelle'  
$PATH_BACKUPROOT = '\\Server\Share\Backup'  
$FILE_FILTER = '*.*'  
$PATH_LOGS = "$PATH_BACKUPROOT\Logs"  

# Mail Variablen ------------
$mailSMTP = 'smtp.domain.de'  
$mailUSER = 'USERNAME'  
$mailPASS  = 'GEHEIM'  
$mailFROM = 'absender@domain.de'  
$mailTO = 'empfaenger@domain.de'  
$mailBCC = 'empfaenger2@domain.de'  

# ---------- ENDE VARIABLEN --------------

# Datum formatieren
$datum = get-date -Format 'yyyy-MM-dd'  
$monat = get-date -Format 'MM'  

# Pfad zum aktuellen Backup
$pathBackup = "$PATH_BACKUPROOT\$monat\$datum"  

# Pfad für das Logfile
$pathLogfile = "$PATH_LOGS\$datum.log"  

# Ordner anlegen falls sie nicht existieren
if(!(Test-Path $pathBackup)){md $pathBackup | out-null}
if(!(Test-Path $PATH_LOGS)){md $PATH_LOGS | out-null}

# Robocopy Parameter
$parMODE = if((get-date).Day -eq 1){"/M"}else{"/A"}  
$parCOPY = '/S /COPY:DAT'  
$parEX_FILE = '/XF desktop.ini Thumbs.db *.pdf *.dmp'  
$parEX_DIR = '/XD $RECYCLE.BIN Updates Protokolle Install Listen MCP_Archivverzeichnis Kommunik'  
$parAUSW = '/FFT'  
$parREAD = '/R:1 /W:1'  
$parPROTO = '/TS /FP /NDL /TEE /NP'  
$parLOG = "/LOG:$pathLogfile"  

# ARCHIV BIT setzen wenn 1. des Monats
if ($parMODE -eq '/M'){  
    write-host "1. des Monats, setze Archiv-Attribute in der Quelle" -ForegroundColor Cyan  
    attrib +a "$PATH_QUELLE\*.*" /s /d  
}

write-host "Starte Robocopy Prozess ..."  
# Robocopy Action
robocopy.exe """$PATH_QUELLE"" ""$pathBackup"" $FILE_FILTER $parMODE $parCOPY $parEX_FILE $parEX_DIR $parAUSW $parREAD $parPROTO $parLOG" | out-null  
# ----------------
# 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]

$ROBOCOPY_OUTPUT = (gc $pathLogfile)
# Mail Body setzen
$mailBODY = @()
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Gestartet:|Quelle :|Ziel :|Optionen:' }  
$mailBODY += '-'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Der Prozess'}  
$mailBODY += '-'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Insgesamt|Verzeich\.:|Dateien:|Bytes:'}  
$mailBODY += '-'*70  
$mailBODY += $ROBOCOPY_OUTPUT | ?{$_ -match 'Zeiten:|Beendet:'}  
$mailBody = $mailBODY | out-string

# Mails verschicken
if ($ROBOCOPY_ERRORCODE -le 1){
    write-host  "Robocopy war erfolgreich, versende Zusammenfassungen via Mail..." -ForegroundColor Green  
    Send-MailMessage -from $mailFROM -To $mailTO -Bcc $mailBCC -Subject $mailSUBJECT -Body $mailBODY -SmtpServer $mailSMTP -Credential (New-Object pscredential $mailUSER,(ConvertTo-SecureString -AsPlainText $mailPASS -Force))

}else{
    write-host "Robocopy hat Fehler gemeldet, Versende Mail mit Logfile ..." -ForegroundColor RED  
    Send-MailMessage -from $mailFROM -To $mailTO -Bcc $mailBCC -Subject $mailSUBJECT -Body $mailBODY -SmtpServer $mailSMTP -Attachments $pathLogfile -Credential (New-Object pscredential $mailUSER,(ConvertTo-SecureString -AsPlainText $mailPASS -Force))
}

# Die letzten 5 Backups beibehalten
write-host "Cleanup ..." -ForegroundColor Cyan  
dir "$PATH_BACKUPROOT\$monat\????-??-??" | ?{$_.PSIsContainer} | sort CreationTime -Descending | select -Skip 5 | Remove-Item -Force  

write-host "Script beendet" -ForegroundColor Green  
Viel Spaß face-wink
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Member: nother
nother Oct 12, 2014 at 13:59:17 (UTC)
Goto Top
Respekt! Getestet und funktioniert auf anhieb!
Habe nur -Credential auskommentiert weil ich die nicht benötige...
You made my day!

Vielen Dank für die Mühe

nother