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!
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 251289
Url: https://administrator.de/contentid/251289
Ausgedruckt am: 08.11.2024 um 05:11 Uhr
2 Kommentare
Neuester Kommentar
Moin nother,
in Powershell umgesetzt und grob angetestet könnte dies so aussehen:
Viel Spaß
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
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
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