37414
Goto Top

Batchdatei mit Antwort auf eine Frage per Errorlevel realisieren?

Hallo,

ich habe mal eine Frage zu ERRORLEVEL.
Und zwar nutze ich eine Batchdatei, die ein paar Verzeichnisse sichert.
Am Ende dieser Datei stelle ich (hier nur als Beispiel) die Frage, ob das Logfile geöffnet werden soll oder nicht.
Dazu nutze ich eine Ja/Nein Abfrage mit CHOICE. Eine bessere Möglichkeit ist mir zunächst mal nicht eingefallen.
Das funktioniert aber auf jeden fall so auch...

Nun 2 Fragen:

1) würdet Ihr das auch so lösen oder gibt es eine bessere Möglichkeit für eine solche Abfrage mit Ja/Nein?

2) wie würde ich denn jetzt einen wirklichen Fehler abfragen? Damit meine ich einen Fehler beim Kopiervorgang in der Form, dass mir z.B. gemeldet wird "Kopiervorgang erfolgreich", wenn kein Fehler aufgetaucht ist und "Kopiervorgang fehlgeschlagen", wenn ein Fehler auftrat.
Kann ich dazu ein weiteres ERRORLEVEL einsetzen und wenn ja... wie wäre es sinnvoll?
Spontan würde ich es so machen, wie bei der Abfrage unten auch face-wink

Gruß,
imebro

robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /LOG:%Logfile%

CHOICE /N /C JN /M ".     Soll das Logfile geöffnet werden? --> (J)a, (N)ein: "  

if errorlevel 2 goto :ENDE
if errorlevel 1 goto :WEITER

:ENDE
echo.     Die Datei wird mit ENTER beendet
pause > NUL
goto :EOF

:WEITER
start notepad %Logfile%
echo.
echo.     Das Logfile wurde gestartet
echo.
echo.     Die Sicherungsdatei wird mit ENTER beendet
pause > NUL

:EOF

Content-ID: 572082

Url: https://administrator.de/forum/batchdatei-mit-antwort-auf-eine-frage-per-errorlevel-realisieren-572082.html

Ausgedruckt am: 24.12.2024 um 03:12 Uhr

Pjordorf
Pjordorf 15.05.2020 um 18:23:51 Uhr
Goto Top
Hallo,

Zitat von @37414:
2) wie würde ich denn jetzt einen wirklichen Fehler abfragen? Damit meine ich einen Fehler beim Kopiervorgang in der Form, dass mir z.B. gemeldet wird "Kopiervorgang erfolgreich", wenn kein Fehler aufgetaucht ist und "Kopiervorgang fehlgeschlagen", wenn ein Fehler auftrat.
ERRORLEVEL immer Direkt nach dem Ereigniss abfragen danach ann es schon nicht mehr Gültig sein. Ung erzeugt dein Code (hier Robocopy) denn ein Errorlevel? https://ss64.com/nt/robocopy-exit.html
https://support.microsoft.com/de-de/help/954404/return-codes-that-are-us ...
robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /LOG:%Logfile%
If Errorlevel....

Gruß,
Peter
37414
37414 15.05.2020 um 18:57:32 Uhr
Goto Top
Danke für Deine Nachricht.

In meinem Beispiel mußte ich ja zunächst die CHOICE-Abfrage machen, da sich die ERRORLEVEL-Abfrage ja daruf bezieht.

Daher nehme ich an, Du meinst mit direkt danach meine Fehler-Abfrage...
Also Robocopy würde ja den Rückgabe-Code 1 geben (Alle Dateien wurden erfolgreich kopiert.).
Dann müßte ich doch eigentlich auch eine Fehlerabfrage - direkt hinter dem Kopiervorgang - wie folgt machen können:

robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /LOG:%Logfile%

if errorlevel 1 goto :FEHLER

echo.     Der Kopiervorgang war erfolgreich
echo.
echo.     Die Datei wird mit ENTER beendet
pause > NUL
goto :EOF

:FEHLER
echo.     Der Kopiervorgang ist fehlgeschlagen!!
echo.
echo.     Die Datei wird mit ENTER beendet
pause > NUL

:EOF

So würde ich mir das vorstellen.
Aber wie setze ich meine Ja/Nein-Abfrage mit CHOICE nun noch dazu?

Gruß,
imebro
Pjordorf
Pjordorf 15.05.2020 um 19:29:21 Uhr
Goto Top
Hallo,

Zitat von @37414:
In meinem Beispiel mußte ich ja zunächst die CHOICE-Abfrage machen, da sich die ERRORLEVEL-Abfrage ja daruf bezieht.
Das ist eine von Robocopy vollkommen unabhängige sache.

Also Robocopy würde ja den Rückgabe-Code 1 geben (Alle Dateien wurden erfolgreich kopiert.).
Dann müßte ich doch eigentlich auch eine Fehlerabfrage - direkt hinter dem Kopiervorgang - wie folgt machen können:
Ja, aber wenn du auf 1 Testest hat sich das erübrigt. ! Bedeutet bei Robocopy Erfolgreich, keine Fehler....

Aber wie setze ich meine Ja/Nein-Abfrage mit CHOICE nun noch dazu?
Ganz normal wie ín deiner Frage, mal https://www.robvanderwoude.com/choice.php Lesen oder im CMD Fenster ein Choice /? absetzten. https://docs.microsoft.com/de-de/windows-server/administration/windows-c ...
https://en.wikipedia.org/wiki/Choice_(command) und J/N ist da schon standard http://www.antonis.de/dos/batchtut/bat-kurs/#19

Gruß,
Peter
37414
37414 15.05.2020 um 22:49:44 Uhr
Goto Top
OK und danke. Habe wohl eine Lösung gefunden...

Aber noch eine Frage.
Bei mir wird über "Kopiervorgang war erfolgreich" jetzt immer folgendes ausgegeben am Bildschirm im CMD-Fenster:

"Protokolldatei: D:\Desktop\BACKUP\Robocopy-Logs\Batch-Vorlage_LOG.txt"

Wodurch wird das verursacht? Ggf. durch die ERRORLEVEL-Abfrage für den Fehler?
Und wie bekomme ich diese Ausgabe weg?

Gruß,
imebro
ricardobohner
ricardobohner 17.05.2020 um 13:06:31 Uhr
Goto Top
Der output "Protokolldatei: D:\Desktop\BACKUP\Robocopy-Logs\Batch-Vorlage_LOG.txt" wird duch den parameter "/LOG:%Logfile%" verursacht.

Wenn du den vollen robocopy output im Log und im Dos Fenster haben willst kannst den parameter /tee einsetzen

Wenn du garkeinen output im Dos Fenster willst kannst es ja ins schwarze loch schicken (also nut den output)

robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /LOG:%Logfile%> Nul
37414
37414 17.05.2020 um 14:23:32 Uhr
Goto Top
Danke Dir...

Das ist eine gute Idee, mit "> Nul" die Ausgabe im DOS-Fenster zu verhindern.

Gruß,
imebro
Pjordorf
Pjordorf 17.05.2020 um 14:30:49 Uhr
Goto Top
Hallo,

Zitat von @37414:
Das ist eine gute Idee, mit "> Nul" die Ausgabe im DOS-Fenster zu verhindern.
Da ist der Parameter /NS /NC /NFC /NDL /NP besser geeignet. Ein Robocopy /? zeigt es dir auch.

Gruß,
Peter
37414
37414 17.05.2020 aktualisiert um 15:01:08 Uhr
Goto Top
Seltsamer Weise werden in dieser Batch jedoch Informationen sowie eine Abfrage nicht ausgegeben (siehe im Code ab Zeile 18 und ab Zeile 50).
Stattdessen wird etwas ausgegeben, was in der Batch überhaupt nicht drin steht.

Hier ein Teil meines Codes:

set Quelle="E:"  
set Ziel="G:"  
set Logfile="D:\Desktop\BACKUP\Robocopy-Logs\E_nach_G_LOG.txt"  


set "excludes="  
for /f "usebackq delims=" %%a in ("E:\excludes.txt") do set excludes=!excludes! /XD "%%a"  
echo Ausgeschlossene Verzeichnisse: %excludes%


robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 %excludes% /LOG:%Logfile% > Nul /L


if errorlevel 1 goto :FEHLER

echo.
echo      *************************************
echo      * Der Kopiervorgang war erfolgreich *
echo      *************************************
echo.
echo.     Weiter mit ENTER
pause > NUL
goto :FRAGE

:FEHLER
echo.
echo.
echo      *********************************************************
echo      * F E H L E R >> Der Kopiervorgang ist fehlgeschlagen!! *
echo      *********************************************************
echo.
echo.     Die Sicherung wird mit ENTER beendet
pause > NUL
goto :EOF

:FRAGE

REM Bildschirm löschen!
CLS

CHOICE /N /C JN /M "a%BS%     Soll das Logfile geöffnet werden? --> (J)a, (N)ein: "  


if errorlevel 2 goto :PAUSE
if errorlevel 1 goto :WEITER


:PAUSE

echo      ********************************
echo      * Sicherung beenden = ENTER... *
echo      ********************************
echo.
pause > NUL
goto :EOF

:WEITER
start notepad %Logfile%
echo.
echo.
echo.     Das Logfile wurde gestartet
echo.
echo.
echo.
echo      ********************************
echo      * Sicherung beenden = ENTER... *
echo      ********************************
echo.
pause > NUL

:EOF

Die Ausgabe sieht jedoch so aus, nachdem ich den Kopiervorgang gestartet habe:

falsche ausgabe

Vor allem habe ich keine Ahnung, wo unten die beiden Reihen mit "***" herkommen und den Text "Die Sicherung wird mit ENTER beendet" gibt es in meiner Batch überhaupt nicht!!

Eigentlich müßte es nach dem Kopiervorgang doch weitergehen mit der Meldung "Der Kopiervorgang war erfolgreich" (siehe Codezeile 18).

Wieso funktioniert das so nicht?

Gruß,
imebro
Pjordorf
Pjordorf 17.05.2020 um 15:34:01 Uhr
Goto Top
Hallo,

Zitat von @37414:
Vor allem habe ich keine Ahnung, wo unten die beiden Reihen mit "***" herkommen und den Text "Die Sicherung wird mit ENTER beendet" gibt es in meiner Batch überhaupt nicht!!
Irgenwo wird es stehen. Aber wenn deine Information immer noch als Geheim eingestuft ist, wirst du selbst suchen müssen. Oder dein Rechner hat KI und will dir etwas sagen face-smile

Eigentlich müßte es nach dem Kopiervorgang doch weitergehen mit der Meldung "Der Kopiervorgang war erfolgreich" (siehe Codezeile 18).
Da wir nicht dein ganzes Projekt und dessen Inhalte kennen können wir dir dies weder bestätigen noch verneinen....

Wieso funktioniert das so nicht?
Was schreibt dein Robocopy LOG? Welche Zeit hat es gebraucht? Und sicher das dein LOG korrekt gefüllt ist?

Gruß,
Peter
37414
37414 17.05.2020 um 16:15:17 Uhr
Goto Top
Sorry - ist natürlich kein Geheimnis. Ich hatte einfach nur nicht einen so langen Code hier einstellen wollen.

Hier jetzt der komplette Code:

@ echo off &setlocal enabledelayedexpansion
echo.

CHCP 1252

color 9F
mode con lines=41 cols=172

for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"  

CHOICE /N /C JN /M "a%BS%     Hat die Ziel-FP den LW-Buchstaben G? --> (J)a, (N)ein: "  


if errorlevel 2 goto :PAUSE
if errorlevel 1 goto :WEITER


:PAUSE

echo.     Das LW in der Datentraegerverwaltung (über "Computerverwaltung") zunaechst auf G einstellen... dann ENTER!  
pause > NUL

:WEITER

echo.     ********************************
echo.     * Sicherung starten = ENTER... *
echo.     ********************************
echo.
pause > NUL
echo.


robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 %excludes% /LOG:%Logfile% > Nul /L


if errorlevel 1 goto :FEHLER

echo.
echo      *************************************
echo      * Der Kopiervorgang war erfolgreich *
echo      *************************************
echo.
echo.     Weiter mit ENTER
pause > NUL
goto :FRAGE

:FEHLER
echo.
echo.
echo      *********************************************************
echo      * F E H L E R >> Der Kopiervorgang ist fehlgeschlagen!! *
echo      *********************************************************
echo.
echo.     Die Sicherung wird mit ENTER beendet
pause > NUL
goto :EOF

:FRAGE

REM Bildschirm löschen!
CLS

CHOICE /N /C JN /M "a%BS%     Soll das Logfile geöffnet werden? --> (J)a, (N)ein: "  


if errorlevel 2 goto :PAUSE
if errorlevel 1 goto :WEITER


:PAUSE

echo      ********************************
echo      * Sicherung beenden = ENTER... *
echo      ********************************
echo.
pause > NUL
goto :EOF

:WEITER
start notepad %Logfile%
echo.
echo.
echo.     Das Logfile wurde gestartet
echo.
echo.
echo.
echo      ********************************
echo      * Sicherung beenden = ENTER... *
echo      ********************************
echo.
pause > NUL

:EOF

Und ich finde hier den Text, der ausgegeben wird, tatsächlich nicht face-wink

Die LOG-Datei gibt folgendes aus:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren für Windows                              
-------------------------------------------------------------------------------

  Gestartet: Sonntag, 17. Mai 2020 14:46:08
   Quelle : E:\
     Ziel = G:\

    Dateien : *.*
	    
 Ausgeschl. Verzeichnisse: E:\$RECYCLE.BIN
	    E:\MozBackup
	    E:\PROFILE - FF + TB mit Synchredible
	    E:\Recycler
	    E:\System Volume Information
	    
  Optionen: *.* /DST /L /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /NP /MT:4 /R:3 /W:10 

------------------------------------------------------------------------------

	    Neue Datei		     111	E:\excludes.txt

>>>> hier kommen noch ganz viele Dateien <<<<

------------------------------------------------------------------------------

           Insgesamt   KopiertÜbersprungenKeine Übereinstimmung    FEHLER    Extras
Verzeich.:     46316     46311         5         0         0         0
  Dateien:    394159    394159         0         0         0         0
    Bytes: 169.602 g 169.602 g         0         0         0         0
   Zeiten:   0:00:19   0:00:00                       0:00:00   0:00:19
   Beendet: Sonntag, 17. Mai 2020 14:46:27

...hinter "E:\excludes.txt" kommen dann natürlich massenhaft Zeilen mit weiteren Dateien, die gesichert wurden. Die möchte ich Euch ersparen. Deshalb hier der Eintrag zwischen >>>>> <<<<<<<.

Gruß,
imebro
37414
37414 18.05.2020 um 15:23:42 Uhr
Goto Top
Hmmm... hat niemand von Euch eine Idee, wieso die weiteren Abfragen nicht ausgegeben werden und woher der unten eingefügte Text stammt?

Freue mich auf Eure Antwort.

LG
imebro
ricardobohner
ricardobohner 22.05.2020 aktualisiert um 19:09:22 Uhr
Goto Top
Ja, nach
echo.     Die Sicherung wird mit ENTER beendet
pause > NUL

Hast doch eine pause das ist doch logisch das der text da stehen bleibt und nich weiter geht bis man eine taste drückt.

Der unten eingefügte text soviel ich verstanden habe ist die zusmmenfassung von robocopy die wird normalerweise immer gezeigt es sei den du nutzt den /njs (No Job Summary) parameter.
37414
37414 23.05.2020 um 19:30:04 Uhr
Goto Top
Danke Dir.

Aber der Text "Die Sicherung wird mit Enter beendet" (siehe mein blaues JPG weiter oben) steht ja tatsächlich nirgendwo in meiner Batch drin.
Oder meintest Du das mit der Zusammenfassung von robocopy?

Und nach "Sicherung starten" kommen doch noch mehrere Abfragen, die jedoch nicht erscheinen. Siehe auch im blauen JPG. Wieso läuft die Batch da nicht weiter ab?

Gruß,
imebro
ricardobohner
ricardobohner 24.05.2020 um 21:36:28 Uhr
Goto Top
Also hier hast du die If's falsch eingesetzt:

Statt:
if errorlevel 2 goto :PAUSE
if errorlevel 1 goto :WEITER
So:
if %errorlevel% EQU 2 goto :PAUSE
if %errorlevel% EQU 1 goto :WEITER

Auf line 54 in deinem code ist es doch:
echo.     Die Sicherung wird mit ENTER beendet

Ich glaube du setzt :EOF falsch ein weist du was das bedeutet?
"End of Function" Also nachdem du eine funktion mit call oder goto rufst sagst du dann mit :EOF das die funktion zu ende ist und man wieder da weitermachen soll von wo die funktion gerufen wurde also in der nächsten line gleich nach dem call oder goto.


Du hast 2 mal die Funktion :PAUSE in deinem code das darf man nicht da müstest du eine umbennen in :Pause2 oder so. Das gleiche mit :Weiter

Wenn du willst das robocopy nicht kopiert sondern nur die Dateien "Listet" die es Kopieren wuerde must du das /L vor dem >nul positioniren.

Statt:
robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 %excludes% /LOG:%Logfile% > Nul /L
So:
robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /L %excludes% /LOG:%Logfile% > Nul


Also dieser teil macht nicht so viel sinn fuer mich (gleich nach dem robocopy):
if errorlevel 1 goto :FEHLER

Da die errorcodes für robocopy wie gefolgt verlaufen:

0 = Keine fehler und keine Dateien Kopiert
1 = Eine oder mehrere Dateien wurden erfolgreich Kopiert
2 = Extra Dateien oder Directories wurden festgestellt. Bitte logfile ueberpruefen fuer mehr Details
4 = Unpassende Dateien oder Directories wurder festgestellt. Bitte logfile ueberpruefen fuer mehr Details.
8 = Einige Dateien konnten nicht Kopiert werden und der wiederholunslimit wurde erreicht.
16 = Robocopy hat keine Dateien Kopiert, verifiziere die comando parameter und ob robocopy genug rechte hat.

  • Also so zusagen Wenn Erfolgreich gehe zu Fehler...

Ich hab eine version mit einigen verbesserungen gemacht wenn du sie ausprobieren willst:

BackupImebro.zip
Pjordorf
Pjordorf 24.05.2020 um 22:42:15 Uhr
Goto Top
Hallo,

Zitat von @37414:
wieso die weiteren Abfragen nicht ausgegeben werden und woher der unten eingefügte Text stammt?
Lasse deine > NUL weg und auch deine ECHO OFF. Dann soltest du sehen was tatsächlich bei dir passiert.
Auch ist dies ziemlicher Blödsinn, da deine Batch Datein von oben nach unten und von Links nach Rechts abearbeitet werden. Erst ein Umleitung mittels > NUL und dann erst Parameter? Und auch deine PAUSE > NUL ist ziemlich verwirrend, da dein Pause ja auf jeden fall wartet und es so am Bildschirm stehen soll. Du Willst das unterdrücken? Dann nutze keine Pause. Aber bei Batch war/ist das eben so. In heutigen OSen gibt es weitaus besserer und vielfältigere möglichkeiten. Da wäre Powershell...

Gruß,
Peter
37414
37414 25.05.2020 um 11:52:05 Uhr
Goto Top
@ricardobohner

Danke Dir für Deine weitere Aufklärung. Habe nicht alles verstanden, aber werde da nochmal weiter recherchieren, damit ich es nachvollziehen kann.
Danke auch für Deine Mühe bezüglich der Batchdatei. Diese ist natürlich perfekt durchdacht, wobei ich aber eine Frage habe zur Zeile 89 Deiner Batch.

Da steht
if errorlevel 2 goto ::SICHERUNGBEENDEN

So wie ich es verstehe, bedeuten die beiden "::" ja, dass dies nur ein Hinweis ist, der nicht ausgegeben wird (also wie REM). Und somit springt die Batch dann gleich weiter zu "pause > NUL" in Zeile 96, woduch die Batch dann beendet wird... richtig so? face-wink

OK...
Jetzt muss ich zunächst mal die Batch noch ein paarmal testen, damit ich auch den Inhalt verstehe. Diese würde dann auch meine neue Vorlage für die weiteren Sicherungs-Bachtes werden.

@Pjordorf
Auch Dir danke für Deine weiteren Hinweise. Im Grunde haben diese sich ja schon durch die von "ricardobohner" erstellte Batch zum größten Teil erledigt.

Danke & Gruß,
imebro
ricardobohner
ricardobohner 25.05.2020 um 13:05:56 Uhr
Goto Top
Das war ein felher den ich nicht bemerkt habe. So sollte es natürlich sein:

if %errorlevel% EQU 2 goto :SICHERUNGBEENDEN
if %errorlevel% EQU 1 goto :WEITER2

Aber die batch funtioniert trozdem wie sie sollte auch mit dem felher...
37414
37414 25.05.2020 um 17:22:53 Uhr
Goto Top
ok und danke...

Ich hatte mich nämlich auch gewundert, weil es die Sprungmarke ":SICHERUNGBEENDEN" nicht gibt.
Aber vermutlich braucht man diese nicht, da es ja unten dann automatisch bei "pause > NUL" weitergeht.

Danke und Gruß,
imebro
37414
37414 25.05.2020 um 18:02:52 Uhr
Goto Top
@ricardobohner

bin soeben dabei, Deine Batch nachzuvollziehen.

Aber ich verstehe das mit der Variablen für Errorlevel noch nicht und... was bedeutet dieser Zusatz "EQU"?

if %errorlevel% EQU 2 goto :PAUSE
if %errorlevel% EQU 1 goto :WEITER

Gruß,
imebro
Pjordorf
Pjordorf 25.05.2020, aktualisiert am 28.05.2020 um 17:56:49 Uhr
Goto Top
Hallo,

Zitat von @37414:
bin soeben dabei, Deine Batch nachzuvollziehen.
Dazu braucht man noch nicht mal einen PC oder Rechner. Das geht mit Papier und Bleistift. face-smile

Aber ich verstehe das mit der Variablen für Errorlevel noch nicht und... was bedeutet dieser Zusatz "EQU"?
Gib mal in deinen Browser als Suchbgriff "Batch EQU" ein und lies dich schlau.

Gruß,
Peter
37414
37414 25.05.2020 aktualisiert um 18:58:16 Uhr
Goto Top
So!! Ich muss hier jetzt mal was loswerden...

@Pjordorf:

Kannst Du bitte mal mit diesem ständigen übergrifflichen und stänkerischen Befehlston aufhören?
Ich bin in diesem Forum kein Angeklagter vor Gericht, sondern ein User, der Unterstützung sucht.

Dein Verhalten hier geht absolut überhaupt nicht und das fällt mir nicht zum ersten Mal auf.
Ich habe mir das jetzt lange genug bieten lassen und werde daher Deine Bemerkungen jetzt auch mal an die Moderatoren melden.

Und noch etwas:
Dich zwingt niemand hier, auf meine Fragen zu antworten.
Wenn meine Fragen Dich nerven, dann klicke doch einfach zum nächsten Thread. Oder - falls Du hier genervt bist, melde Dich doch einfach ab.

Verhalte Dich bitte zukünftig mir (und anderen) gegenüber sachlich und fair!!

Mehr werde ich dazu nicht sagen. Und ich werde hieraus jetzt auch keine Diskussion machen oder auf Deine Kommentare dazu antworten.

Gruß,
imebro