Batch Datensicherung überprüfung

Lars02

Banned
Registriert
Juni 2019
Beiträge
130
Hallo ich habe ein Script geschrieben das die Sicherungsdateien auf einem Server unter-ordner überprüft ob eine Datei von Heute drinnen ist. Wenn ja = alles gut wenn nein = email per blat mail an mich senden. Doch aus einem unbekannten grund will es nicht funktionieren ich lasse das script laufen und er sagt er findet eine Datei von Heute obwohl keine von Heute drinnen ist.
PowerShell:
set "Typ=Datei"
set "Verzeichnis=pfad123"
set "Heute=%date%"
set "MAILPFAD=pfad12"

set "erpPfad=pfad1"
set "fibuPfad=pfad"

set "temp=undefiniert"

net use x: %Verzeichnis%
pause
x:
pause
cd \
pause
cd %erpPfad%
pause
dir
pause


for /r %%i in (*) do (
    set Datum=%%~ti
    set Datum=!Datum:~,-6!
    if "!Heute!"=="!Datum!" (
        (CALL:PentaDateiGefunden)
    )else (
        set "temp=NichtErfolgreich"
    )
)
pause
if "!temp!"=="!NichtErfolgreich!" (
    
    %MAILPFAD%\blat.exe FehlerMail_PSIpenta.txt -to lars.purtscher@bertsch.at -subject "PSIpenta Sicherung nicht gelaufen"
)else (
    (CALL:PentaDateiGefunden)
)
:PentaDateiGefunden
echo Sicherungsdatei(PSIpenta) gefunden! LOG Eintrag...
pause
:: Abfrage des Fibu ordners
set "temp=undefiniert"

net use x: %Verzeichnis%
cd \
cd %fibuPfad%
dir
pause

for /r %%i in (*) do (
    set Datum=%%~ti
    set Datum=!Datum:~,-6!
    
    if "!Heute!"=="!Datum!" (
        (CALL:FibuDateiGefunden)
    )else (
        set "temp=NichtErfolgreich"
    )
)
if "!temp!"=="!NichtErfolgreich!" (
    o:
    cd %MAILPFAD%
    blat.exe FehlerMail_FibuAnbuSicherung.txt -to xy@xymail.com -subject "FibuAnbuSicherung nicht gelaufen"
    echo EMail wurde versendet
    pause
)else (
    (CALL:Ende)
)
:FibuDateiGefunden
echo Sicherungsdatei(FibuAnbuSicherung) gefunden! LOG Eintrag...

:Ende
net use x: /delete /yes
pause
 
Da du !variablen! in einer Schleife nutzt, fehlt das hier am Anfang der Batch:

SETLOCAL ENABLEDELAYEDEXPANSION
 
Das Script gibt trotzdem aus das es eine Datei von Heute gefunden hat.
 
Da sind aber noch mehr Unstimmigkeiten in deinem Skript.

Code:
if "!temp!"=="!NichtErfolgreich!" (
    
    %MAILPFAD%\blat.exe FehlerMail_PSIpenta.txt -to lars.purtscher@bertsch.at -subject "PSIpenta Sicherung nicht gelaufen"
)else (
    (CALL:PentaDateiGefunden)
)
:PentaDateiGefunden
echo Sicherungsdatei(PSIpenta) gefunden! LOG Eintrag...
Hier hast du einen unsauberen Programmablauf. Im TRUE case wird blat.exe aufgerufen und nach der ganzen IF-Struktur mit dem Skript weitergemacht, es wird also auch das komplette :pentaDateiGefunden Label ausgeführt samt echo. Im FALSE case wiederum rufst du das Label als Funktion auf, hast jedoch kein GOTO:EOF am Ende des Labels. Das mag so gewollt sein, widerspricht aber der gängigen Programmierpraxis, weil der Ablauf nicht auf den ersten Blick eindeutig ist.

Eine Funktion baut man in Batch so:

Code:
:: das hier ist der Programmablauf
CALL:EINEFUNKTION
CALL:ANDEREFUNKTION
GOTO:EOF
:: hier ist das Programm am Ende


:: das hier sind die Funktionen
:EINEFUNKTION
echo das ist eine funktion
GOTO:EOF

:ANDEREFUNKTION
echo das ist eine andere funktion
GOTO:EOF


Solange dein Programmablauf nicht sichergestellt ist, kann das Ergebnis deines Skripts beliebig sein, weil wie im oben zitierten Beispiel eben auch im Fehlerfall die Erfolgsmeldung kommt. Prüfe den Rest deines Skripts auf ähnliche Fälle.
 
Danke für die Hilfe!
 
Das heißt es funktioniert jetzt?
 
Kann ich dir noch nicht sagen, da ich gerade anderweitig beschäftigt bin.
 
Habe es jetzt so umgeschrieben weil mir die GOTO´s nicht gefallen haben...
Bash:
set "Typ=Datei"

set "Verzeichnis=pfad"

set "Heute=%date%

set "Mailpfad=andererpfad"

set "erpPfad=pfad123"

set "fibuPfad=pfad1234"

:: Ist es auch so möglich(z.B. C/C#,...):
:: string temp = undefiniert
:: temp = true
:: temp = false

set "temp=undefiniert"

net use x: %Verzeichnis%

x:

cd \


cd %erpPfad%

echo die FOR-Schleife beginnt

pause

for /r %%i in (*) do (
    set Datum=%%~ti
    set Datum=!Datum:~,-6!
   
    if "!Heute!"=="!Datum!" (
        set "temp=true"
    ) ELSE (
        set "temp=false"
    )
)

echo Die IF abfrage wegen der Temp var. beginnt

pause

if "%temp%"=="true" (
    echo PSIpenta sicherung erfolgreich. Sicherungsdatei gefunden!
) ELSE (
    %Mailpfad%\blat.exe %Mailpfad%\FehlerMailPSIpenta.txt  -to lars.purtscher@bertsch.at -subject "PSIpenta Sicherung nicht gelaufen"
)

set "temp=undefiniert"

cd\

cd %fibuPfad%

for /r %%i in (*) do (
    set Datum=%%~ti
    set Datum=!Datum:~,-6!
   
    if "!Heute!"=="!Datum!" (
        set "temp=true"
    ) else (
        set "temp=false"
    )
)

:: Test
echo %temp%

if "%temp%"=="true" (
    echo FibuAnbu Sicherung erfolgreich. Sicherungsdatei gefunden!
) ELSE (
    %Mailpfad%\blat.exe %Mailpfad%\FehlerMail_FibuAnbuSicherung.txt -to lars.purtscher@bertsch.at -subject "FibuAnbuSicherung nicht gelaufen"
)

echo Ende der Ueberpruefung
net use x: /delete /yes

Ich überprüfe ob eine Datei von heute im Ordner ist ....bei der 1. Überprüfung ist eine Datei von heute drinnen aber ich bekomme trotzdem eine Mail?
 
Zuletzt bearbeitet:
Zum einen würde ich die ganze cd-Arie durch ein einzelnes pushd ersetzen. Absolute Verzeichnisnavigation statt relativer.

Code:
SET pfad1=x:\bla
SET pfad2=%pfad1%\blubb

pushd %pfad1%

:: do some stuff

pushd %pfad2%

Zum anderen wird deine for-Schleife bzw ihr Ergebnis temp immer nur auf das Ergebnis der letzten Iteration zeigen, die letzte Datei, die im * wildcard gelistet ist. Ohne definierte Sortierung verlässt du dich darauf, dass die Dateien in der richtigen Reihenfolge kommen. Wenn's alphabetisch geht (müsste Standard sein), dann klappt das nur, wenn der Dateiname auch sortierbar mit dem Datum beginnt, also zwingend Jahr-Monat-Tag-Stunde-Minute-Sekunde (je nach benötigter Genauigkeit). Sonst kann es passieren, dass die Datei mit dem heutigen Zeitstempel bereits bei zB h kommt und die folgenden i+ Dateien baller temp wieder auf false.

Entweder du stellst sicher, dass die Reihenfolge stimmt oder du musst den Wert von temp in der Schleife von Iteration zu Iteration durchreichen und quasi verodern - ist einmal true gekommen, bleibt es.

Code:
for... (
... 
   IF "!temp!"=="false"  (    
      IF "!Heute!"=="!Datum!" (
         SET temp=true
      )
   ) 
)

Im übrigen würde ich eher 0 statt false und 1 statt true verwenden. Strings sind immer anfällig gegen Vertipper (zB groß/klein). SET temp=1 bzw IF "!temp!"=="1" sind meist besser.
 
Weißt du gerade auch noch wie man den Ordner nach dem Datum sortiert.? Vielen Vielen Dank für die Hilfe ....!
Ergänzung ()

Andere Idee wenn er eine Datei gefunden hat dann mach ich halt ein GOTO zur nächsten sicherung bzw zum ende....
 
Zuletzt bearbeitet:
Wenn du die IF-Abfrage wie beschrieben umbaust, ist die Sortierung egal, weil der erste Treffer bis hinten durchgereicht wird.

Willst du trotzdem den Weg über die Sortierung gehen, funktioniert das mit for /r so nicht, wenn ich mich nicht irre. Dann müsstest du mit for /f den Output von ('dir /b /o:d') durchlaufen. Ggfs /o:-d für die umgekehrte Reihenfolge und /s wenn Unterverzeichnisse einbezogen werden sollen.

Mit GOTO aus Schleifen springen gilt generell als unschön, weil man den Programmablauf auf unnatürliche Art und Weise verändert. Die Schleife würde dann ja nicht korrekt beendet werden.
 
Raijin schrieb:
Zum einen würde ich die ganze cd-Arie durch ein einzelnes pushd ersetzen. Absolute Verzeichnisnavigation statt relativer.
Funktioniert auf WIN Server 2012 R2 nicht
 
Hmm ok....werde ich nochmal versuchen.
Ergänzung ()

Sry mein Fehler, pushd funktioniert scheinbar doch...
 
Zuletzt bearbeitet:
Raijin schrieb:
Code:
for... (
...
IF "!temp!"=="false" (
IF "!Heute!"=="!Datum!" (
SET temp=true
)
)
)
Das Datum ist ja das Datum der Datei, sprich das ändert sich ja.....ich glaub ich habe die if einfach nicht verstanden....
 
Die Schleife sucht in dieser Form einfach nur nach der ersten Datei von heute und dann reicht das, um temp auf true zu setzen. Weitere Dateien werden dann gar nicht mehr auf das Datum geprüft, weil ja bereits ein Treffer gefunden wurde. Auch neuere Dateien von heute, also zB 1h neuer, ändern daran nichts. Wenn das gewünscht ist, musst du den Vergleich des Zeitstempels entsprechend feiner einstellen.
 
achso also kann ich "meine" if abfrage komplett löschen...?
 
Ja hab´s jetzt vielen dank für die Hilfe!!!
 
Zurück
Oben