19958
Goto Top

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:

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

Content-Key: 52114

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

Printed on: April 26, 2024 at 10:04 o'clock

Mitglied: 36539
36539 Feb 19, 2007 at 22:37:57 (UTC)
Goto Top
Hallo Chris_qlt,

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
Member: filippg
filippg Feb 20, 2007 at 00:08:03 (UTC)
Goto Top
Hallo,

was auf jeden Fall fehlt ist ein goto End:

:cancel
echo
echo Backup wurde NICHT durchgefuehrt !
echo
echo.
goto End
:run
echo.

Filipp
Member: bastla
bastla Feb 20, 2007 at 08:11:01 (UTC)
Goto Top
@36539

Etwas verkürzen könntest Du noch mit
...
if /i "%choice%"=="j" goto run  
if /i "%choice%"=="n" goto cancel  
...

Grüße
bastla
Mitglied: 19958
19958 Feb 20, 2007 at 08:13:58 (UTC)
Goto Top
Hallo zusammen,
zunächst vielen Dank für die Unterstützung! Habe den Vorschlag von oegasee59
aufgegriffen und auf mein choice.com-file verzichtet.
Leider erwuchsen mir hieraus andere Probleme. So wie es es aussieht bekomme ich das Handling nicht hin wenn der Benutzer etwas anderes als J,j,N,n eingibt !?
In dem Fall kommt immer die ausgabe dass das Backup nicht durchgeführt wurde,
das stimmz zwar aber ich möchte gerne dass er wieder auf der Zeile landet um erneut die Eingabe zu machen.. eine akkustische Meldung wenn er was anderes tippt als J oder N
wäre auch nicht schlecht.. sorry leute, programmieren is nich mein Ding. Ich würde mich sehr freuen wenn mir einer meinen Code geradebiegt... mein batchfile geht ja soweit.. es kann sich ja nur um kleinigkeiten handen, oder?

der code:

@echo off
cls
color 0A
echo ************************************************************************
echo BACKUP                                                                  
echo ************************************************************************
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%
echo.
set /p choice=Backup ? Waehlen Sie (J)a oder (N)ein danach mit Enter bestaetigen  
set backupcmd=xcopy /s /c /d /e /h /i /r /k /y
echo.
:choose
if "%choice%"=="j" goto run  
if "%choice%"=="J" goto run  
if "%choice%"=="n" goto cancel  
if "%choice%"=="N" goto cancel  
set choice=_  goto choose
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%"  
goto rep
:cancel
echo.
echo ************************************************************************
echo Backup wurde NICHT ausgefuehrt !
echo ************************************************************************
echo.
goto end
:rep
echo.
echo ************************************************************************
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen !
echo ************************************************************************
echo.
:end
@pause
vielen Dank!
Member: bastla
bastla Feb 20, 2007 at 08:47:21 (UTC)
Goto Top
Hallo Chris_qlt!

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]
Mitglied: 36539
36539 Feb 20, 2007 at 10:06:51 (UTC)
Goto Top
@bastla

ohja Danke - Hand vor Stirn schlag. face-wink

gruß
onegasee59
Mitglied: 36539
36539 Feb 20, 2007 at 10:12:40 (UTC)
Goto Top
@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" face-wink 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
Mitglied: 19958
19958 Feb 21, 2007 at 09:44:18 (UTC)
Goto Top
Hallo,

zunächst wieder vielen Dank für die Unterstützung!
Ich habe gestern Abend die Batch zum laufen gebracht und sie entsprechend angepasst..
Läuft soweit alles prima face-smile

onegasee59 hatte beim xcopy den quiet parameter gesetzt, den habe ich wieder
entfernt (Der User soll sehen dass da was läuft face-wink

Nun dache ich beim testen der Batch es wäre doch toll wenn am Ende mir ein Statusreport ausgegeben würde.
In der Form " es wurden %Anzahl% Dateien übertragen, dies entspricht %Datenmenge% KBytes..
Dies habe ich nun in die Batch versucht einzubauen.. leider funktioniert es noch nicht!?
Würdet Ihr es euch mal ansehen und mir sagen wo (mein?/der ) Fehler liegt?
Das für mich schwierige ist dass der Report alles zusammenrechnen soll, also an allen Zielornern zusammengenommen.. ich denke ich habe da einen Denkfehler mit der Differenzierung.. schaut euch doch bitte mal die Batch an:

@echo off
color 0A
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\Amilo
set filter=*.*
set /A kbytes=bytes/1024
set /A DateiAnzahl=0
set bytes=0
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
echo --------------------------------------------------------------------------
echo BACKUPPROGRAMM
echo --------------------------------------------------------------------------
echo.
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  
set choice=_ 
goto error
:run
cls
echo --------------------------------------------------------------------------
echo BACKUPPROGRAMM
echo --------------------------------------------------------------------------
echo.
echo Bitte Warten! Backup nach %drive%\%dateNtime% in Bearbeitung
echo.
%backupcmd% %source1% "%drive%\%dateNtime%\%dest1%"  
%backupcmd% %source2% "%drive%\%dateNtime%\%dest2%"  
%backupcmd% %source3% "%drive%\%dateNtime%\%dest3%"  
for /R %drive%\%dateNtime%\%dest3% %%f in (%Filter%) do (
    set /A DateiAnzahl += 1
    echo %%f - %%~zfBytes
    set /A bytes=bytes+%%~zf
)
echo %~dp0%Filter%
echo Gesamte Anzahl der kopierten Dateien : %DateiAnzahl%
echo Datenmenge aller kopierten Dateien   : %bytes% Bytes
echo Datenmenge entsprechend umgerechnet  : %kbytes% KBytes
echo.
echo.
goto complete
:complete
::CSOUND 523 0(17) 523 0(17)3136 2093 4186(4)
echo --------------------------------------------------------------------------
echo.
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen
echo.
goto end
:cancel
cls
echo --------------------------------------------------------------------------
echo BACKUPPROGRAMM
echo --------------------------------------------------------------------------
echo.
echo Backup wird NICHT durchgefuehrt
echo.
goto end
:error
cls
::CSOUND 220(2) 294(4)
echo --------------------------------------------------------------------------
echo BACKUPPROGRAMM
echo --------------------------------------------------------------------------
echo.
echo Fehleingabe !
echo.
echo Neuer Versuch ? Bitte beliebige Taste druecken
pause > NUL
cls
goto choose
:end
echo.
echo Zum Beenden des Programmes bitte eine beliebige Taste druecken
pause > NUL
Vielen Dank schon mal, ich bin echt froh dass es diese Seite gibt face-smile
Member: Biber
Biber Feb 21, 2007 at 10:33:22 (UTC)
Goto Top
Moin chris_qlt,

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
)
b) ohne DelayedExpansion...wäre ein weiterer Call-block nötig
@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
Member: maneich
maneich Feb 21, 2007 at 10:53:22 (UTC)
Goto Top
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
Member: maneich
maneich Feb 21, 2007 at 10:53:58 (UTC)
Goto Top
-
Member: maneich
maneich Feb 21, 2007 at 10:54:30 (UTC)
Goto Top
-
Member: maneich
maneich Feb 21, 2007 at 10:55:01 (UTC)
Goto Top
-
Member: maneich
maneich Feb 21, 2007 at 10:55:34 (UTC)
Goto Top
-
Member: maneich
maneich Feb 21, 2007 at 10:56:06 (UTC)
Goto Top
-
Mitglied: 36539
36539 Feb 21, 2007 at 10:59:25 (UTC)
Goto Top
Hallo Chris_qlt,

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

onegasee59

PS:
Kann jemand mal die Mehrfachpostings von "maneich" löschen?!
@maneich Bitte Geduld - nicht mehrfach klicken - es dauert manchmal etwas länger
Mitglied: 19958
19958 Feb 22, 2007 at 12:00:19 (UTC)
Goto Top
Hallo zusammen,

vielen Dank für euere Unterstützung! Mein Programm funktioniert nun face-smile
Sollte es jemand benötigen, hier der fertige Code...

@echo off
color 0A
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\Amilo
set filter=*.*
set /A DateiAnzahl=0
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
echo **************************************************************************
echo BACKUPPROGRAMM
echo **************************************************************************
echo.
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  
set choice=_ 
goto error
:run
cls
echo **************************************************************************
echo BACKUPPROGRAMM
echo **************************************************************************
echo.
echo Bitte Warten! Backup nach %drive%\%dateNtime% in Arbeit...
echo.
CSOUND 523 0(17) 523 0(17) 523 0(17)
%backupcmd% %source1% "%drive%\%dateNtime%\%dest1%" > NUL  
%backupcmd% %source2% "%drive%\%dateNtime%\%dest2%" > NUL  
%backupcmd% %source3% "%drive%\%dateNtime%\%dest3%" > NUL  
echo.
for /R %drive%\%dateNtime% %%f in (%Filter%) do (
set /A DateiAnzahl += 1
set /A bytes+=%%~zf
set /A kbytes=bytes/1024
set /A mbytes=kbytes/1024
)
echo Kopierte Dateien (Anzahl)        : %DateiAnzahl%
echo Kopierte Datenmenge in Bytes     : %bytes%
echo Kopierte Datenmenge in Kilobytes : %kbytes%
echo Kopierte Datenmenge in Megabytes : %mbytes%
echo.
echo.
goto complete
:complete
CSOUND 1046,2093,1318,2637,1568,3136,2093,4186(4)
echo **************************************************************************
echo.
echo Backup nach %Drive%\%dateNtime% erfolgreich abgeschlossen
echo.
goto end
:cancel
cls
echo **************************************************************************
echo BACKUPPROGRAMM
echo **************************************************************************
echo.
echo Backup wird NICHT durchgefuehrt
echo.
goto end
:error
cls
csound 220(2) 294(4)
echo **************************************************************************
echo BACKUPPROGRAMM
echo **************************************************************************
echo.
echo Fehleingabe !
echo.
pause 
cls
goto choose
:end
echo.
pause 
Danke an alle!