19958
19.02.2007, aktualisiert am 22.02.2007
5681
17
0
Backup per Batch - fast ok, aber Probleme mit choiceroutinen (calls?)
Hallo zusammen,
nehmt es mir bitte nicht übel, aber nach stundenlangem tüfteln weiss ich nicht mehr weiter.
Ich schrieb eine Batch die mir Daten auf ein USB Medium backuppen soll. Leider hakt es bei dem
choice befehl. ich weiss dass dieser interpreter unter XP nicht zur verfügung steht, weshalb ich ihn
jedoch als file habe im selben DIR wie mein batchfile... also gehts wohl um call aufrufe?
Nun habe ich folgendes Problem:
In meinem Batch soll man wählen können, Backup (J)a oder (N)ein.
wenn man nun Ja eingibt geht alles gut denke ich..
aber bei Nein sollte als anzeige folgendes kommen:
nehmt es mir bitte nicht übel, aber nach stundenlangem tüfteln weiss ich nicht mehr weiter.
Ich schrieb eine Batch die mir Daten auf ein USB Medium backuppen soll. Leider hakt es bei dem
choice befehl. ich weiss dass dieser interpreter unter XP nicht zur verfügung steht, weshalb ich ihn
jedoch als file habe im selben DIR wie mein batchfile... also gehts wohl um call aufrufe?
Nun habe ich folgendes Problem:
In meinem Batch soll man wählen können, Backup (J)a oder (N)ein.
wenn man nun Ja eingibt geht alles gut denke ich..
aber bei Nein sollte als anzeige folgendes kommen:
echo ************************************************************************
echo Backup wurde NICHT durchgefuehrt !
echo ************************************************************************
Leider kommt aber immer dass das Backup erfolgte.. *kopfkratz*
Bin ich nun total verblödet? Was habe ichvergessen oder übersehen?
Sorry, habe schon jahrelang keine Batches mehr geschrieben, vielleicht hilft mir einer kurz
mal aus oder auf die und bringt den Kram in die richtige Ordnung?
Hey, 1000 Dank schon mal!!!!!!!
Hier das Script:
@echo off
Cls
Color 0A
echo ************************************************************************
echo * BACKUPPER *
echo ************************************************************************
set source1=C:\Tempo
set source2=C:\Mail
set source3=C:\ZBoot
set dest1=Quellordner1
set dest2=Quellordner2
set dest3=Quellordner3
set drive=Y:\Backup\
set dateNtime=%date:~0,2%-%date:~3,2%-%date:~6,6%_%time:~0,2%-%time:~3,2%
set backupcmd=xcopy /s /c /d /e /h /i /r /k /y
choice /c:JN /N Backup starten ? Waehlen Sie (J)a oder (N)ein
echo.
echo.
if errorlevel 1 goto run
if errorlevel 2 goto cancel
echo.
:run
echo Starte Backup nach: %drive%\%dateNtime%
echo.
%backupcmd% %source1% "%drive%\%dateNtime%\%dest1%"
%backupcmd% %source2% "%drive%\%dateNtime%\%dest2%"
%backupcmd% %source3% "%drive%\%dateNtime%\%dest3%"
if errorlevel 0 goto run
cls
:cancel
echo ************************************************************************
echo Backup wurde NICHT durchgefuehrt !
echo ************************************************************************
echo.
:run
echo.
echo ************************************************************************
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen !
echo ************************************************************************
echo.
:End
@pause
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 52114
Url: https://administrator.de/contentid/52114
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo Chris_qlt,
machs Dir doch einfacher und verzichte auf das Tool
gruß
onegasee59
machs Dir doch einfacher und verzichte auf das Tool
:auswahl0
echo.
cls
set /p choice=Backup starten ? Waehlen Sie (J)a oder (N)ein - Eingabe mit Taste Enter bestaetigen:__ ("__" steht hier für 2 Leerzeichen, sieht besser aus)
if "%choice%"=="j" goto run
if "%choice%"=="J" goto run
if "%choice%"=="n" goto cancel
if "%choice%"=="N" goto cancel
set choice=_ (exakt so schreiben, damit werden ALLE Eingaben außer j/J/n/N abgewiesen ohne das das Tool abbricht
goto auswahl0
gruß
onegasee59
Hallo Chris_qlt!
Versuch es damit:
Grüße
bastla
[Edit] Anstatt einzelner Hinweise Code angepasst [/Edit]
Versuch es damit:
@echo off
color 0A
set source1=C:\savegame
set source2=C:\Mail
set source3=C:\ZBoot
set dest1=Quellordner1
set dest2=Quellordner2
set dest3=Quellordner3
set drive=E:\Backup\PC
set dateNtime=%date:~0,2%-%date:~3,2%-%date:~6,6%_%time:~0,2%-%time:~3,2%
set backupcmd=xcopy /s /c /d /e /h /i /r /k /y
:choose
cls
echo.
echo BACKUP
echo.
echo.
set /p choice=Backup ? Waehlen Sie (J)a oder (N)ein danach mit Enter bestaetigen
echo.
if /i "%choice%"=="j" goto :run
if /i "%choice%"=="n" goto :cancel
set choice=
goto :choose
:run
echo Starte Backup nach: %drive%\%dateNtime%
echo.
%backupcmd% %source1% "%drive%\%dateNtime%\%dest1%"
%backupcmd% %source2% "%drive%\%dateNtime%\%dest2%"
%backupcmd% %source3% "%drive%\%dateNtime%\%dest3%"
echo.
echo.
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen !
echo.
echo.
goto :end
:cancel
echo.
echo.
echo Backup wurde NICHT ausgefuehrt !
echo.
echo.
:end
@pause
Grüße
bastla
[Edit] Anstatt einzelner Hinweise Code angepasst [/Edit]
@chris_qlt
Wenn dein Tool nicht auch für jemanden gedacht ist der Sehprobleme hat oder gar Blind ist verzichte auf die Soundausgabe.
Es ist kein wirklicher Sound, nur eine Akustische Meldung.
Seis drum, wenn du unbedingt Fehler-Ton willst lade Dir die "csound.zip" von meiner Webseite.
http://www.der-wmp.de/extra/csound.zip
Entpacke diese ins gleiche Verzeichniss in der Deine Batch liegt. Du benötigst nur die "csound.com, die "csound.txt" kannst Du wieder löschen.
der code sehe dann so aus: (mal bei bastla "geklaut" und ergänzt)
gruß
onegasee59
Wenn dein Tool nicht auch für jemanden gedacht ist der Sehprobleme hat oder gar Blind ist verzichte auf die Soundausgabe.
Es ist kein wirklicher Sound, nur eine Akustische Meldung.
Seis drum, wenn du unbedingt Fehler-Ton willst lade Dir die "csound.zip" von meiner Webseite.
http://www.der-wmp.de/extra/csound.zip
Entpacke diese ins gleiche Verzeichniss in der Deine Batch liegt. Du benötigst nur die "csound.com, die "csound.txt" kannst Du wieder löschen.
der code sehe dann so aus: (mal bei bastla "geklaut" und ergänzt)
@echo off && setlocal
color 0A
set source1=C:\savegame
set source2=C:\Mail
set source3=C:\ZBoot
set dest1=Quellordner1
set dest2=Quellordner2
set dest3=Quellordner3
set drive=E:\Backup\PC
set dateNtime=%date:~0,2%-%date:~3,2%-%date:~6,6%_%time:~0,2%-%time:~3,2%
set backupcmd=xcopy /s /c /d /e /h /i /r /k /q /y
::Anmerkung: ich schreibe hier immer "kreisch" lässt sich leichter merken ;-)
::ergebe dann --> set backupcmd=xcopy k /r /e /i /s /c /h /d /q /y
:choose
cls
echo.
echo BACKUP
echo.
echo.
set /p choice=Backup ? Waehlen Sie (J)a oder (N)ein danach mit Enter bestaetigen:__ (__ steht für Leerzeichen, für bessere Optik)
echo.
if /i "%choice%"=="j" goto run
if /i "%choice%"=="n" goto cancel
set choice=_ ----> (das "_" MUSS da hin, sonst funktioniert es nicht richtig)
goto choose
:run
cls
echo.
echo.
echo Bitte Warten! - Backup nach: %drive%\%dateNtime% in Arbeit
%backupcmd% %source1% "%drive%\%dateNtime%\%dest1%" > nul
%backupcmd% %source2% "%drive%\%dateNtime%\%dest2%" > nul
%backupcmd% %source3% "%drive%\%dateNtime%\%dest3%" > nul
echo.
echo.
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen !
echo.
echo.
goto end
:cancel
echo.
echo.
rem Tonausgabe für "Backup wurde NICHT ausgefuehrt !"
csound 220(2) 294(4)
echo Backup wurde NICHT ausgefuehrt !
echo.
echo.
:end
endlocal
@pause
gruß
onegasee59
Moin chris_qlt,
der Fehler liegt in diesem kleinen Block, der für den CMD-Interpreter ja nur eine einzige Anweisung darstellt:
Auch wenn es optisch anders wirkt - es ist nur EINE Anweisung.
Deshalb werden die Variablen, z.B. %bytes% auch nur EINMAL aufgelöst.
Und wenn dann %bytes% vor Beginn der Anweisung den Wert 0 hat,
dann wird auch nach 40x Setzen von "set /A bytes=bytes+%%~zf" immer wieder übersetzt: "set /A bytes=0+%%~zf".
Abhilfe
a) Arbeiten mit Setlocal EnableDelayedExpansion
b) ohne DelayedExpansion...wäre ein weiterer Call-block nötig
Gruss Biber
der Fehler liegt in diesem kleinen Block, der für den CMD-Interpreter ja nur eine einzige Anweisung darstellt:
for /R %drive%\%dateNtime%\%dest3% %%f in (%Filter%) do (
set /A DateiAnzahl += 1
echo %%f - %%~zfBytes
set /A bytes=bytes+%%~zf
)
Auch wenn es optisch anders wirkt - es ist nur EINE Anweisung.
Deshalb werden die Variablen, z.B. %bytes% auch nur EINMAL aufgelöst.
Und wenn dann %bytes% vor Beginn der Anweisung den Wert 0 hat,
dann wird auch nach 40x Setzen von "set /A bytes=bytes+%%~zf" immer wieder übersetzt: "set /A bytes=0+%%~zf".
Abhilfe
a) Arbeiten mit Setlocal EnableDelayedExpansion
@echo off & Setlocal <b>EnableDelayedExpansion</b>
.....
for /R %drive%\%dateNtime%\%dest3% %%f in (%Filter%) do (
set /A DateiAnzahl += 1
echo %%f - %%~zfBytes
set /A bytes+=%%~zf
)
@echo off & setlocal
....
for /R %drive%\%dateNtime%\%dest3% %%f in (%Filter%) do call :AddBytesEtc "%%~f" - %%zf
goto ....
:AddBytesEtc
set /A DateiAnzahl += 1
echo %~1 - %2 Bytes
set /A bytes=bytes+%z1
goto :eof
Gruss Biber
Hallo,
hier nochmal grundsätzliches zur Choice-Option:
Die Errorabfragen werden immer mit größer/gleich (>=) abgehandelt und das bedeutet, daß die Errorlevelabfragen dann auch immer vom oben nach unten durchgeführt werden müßen.
In Deinem Fall also
1. if errorlevel 2 goto xy2
2. if errorlevel 1 goto xy1
Die zweite Abfrage nach Errorlevel 1 wird nicht benötigt. Wenn bei choice /c 12 der Errorlevel nicht größer/gleich 2 ist, bleibt nur noch die 1 und alles was bei Errorlevel 1 abgearbeitet werden soll, kann direkt und die erste Abfrage gesetzt werden.
MfG maneich
hier nochmal grundsätzliches zur Choice-Option:
Die Errorabfragen werden immer mit größer/gleich (>=) abgehandelt und das bedeutet, daß die Errorlevelabfragen dann auch immer vom oben nach unten durchgeführt werden müßen.
In Deinem Fall also
1. if errorlevel 2 goto xy2
2. if errorlevel 1 goto xy1
Die zweite Abfrage nach Errorlevel 1 wird nicht benötigt. Wenn bei choice /c 12 der Errorlevel nicht größer/gleich 2 ist, bleibt nur noch die 1 und alles was bei Errorlevel 1 abgearbeitet werden soll, kann direkt und die erste Abfrage gesetzt werden.
MfG maneich
Hallo Chris_qlt,
das musst Du auch noch ändern sonst funktioniert "set choice=_ " nicht korrekt:
onegasee59
PS:
Kann jemand mal die Mehrfachpostings von "maneich" löschen?!
@maneich Bitte Geduld - nicht mehrfach klicken - es dauert manchmal etwas länger
das musst Du auch noch ändern sonst funktioniert "set choice=_ " nicht korrekt:
:choose
...
set /p choice=Backup ? Waehlen Sie (J)a oder (N)ein, danach mit Enter bestaetigen :
if /i "%choice%"=="j" goto run
if /i "%choice%"=="n" goto cancel
goto error
...
:error
...
echo Fehleingabe !
echo.
echo Neuer Versuch ? Bitte beliebige Taste druecken
pause > NUL
set choice=_
cls
goto choose
...
set /p choice=Backup ? Waehlen Sie (J)a oder (N)ein, danach mit Enter bestaetigen :
if /i "%choice%"=="j" goto run
if /i "%choice%"=="n" goto cancel
goto error
...
:error
...
echo Fehleingabe !
echo.
echo Neuer Versuch ? Bitte beliebige Taste druecken
pause > NUL
set choice=_
cls
goto choose
onegasee59
PS:
Kann jemand mal die Mehrfachpostings von "maneich" löschen?!
@maneich Bitte Geduld - nicht mehrfach klicken - es dauert manchmal etwas länger