itschlumpf
Goto Top

Batch über eine andere Batch mit Parametern starten

Hallo zusammen,

ich bin gerade daran, eine Backup-Datei zu schreiben, welche mir bestimmte Daten von einem entfernten Rechner kopieren sollen. Soweit so gut, das habe ich hinbekommen. Nun will ich aber das Script automatisieren und er soll mir eine liste mit verschiedenen Rechnernamen nacheinander ansprechen. Leider bekomme ich das nicht ganz so hin. Ich habe mir schon überlegt, dass ganze über 2 Batch files laufen zu lassen.
In dem Fall würde ich in der ersten Batch die Rechner deklarieren und dann die zweite batch mittels call aufrufen. Leider funktioniert das nicht bzw. das erste mal ruft er die zweite Batch auf und dann die nächsten überspringt er einfach.
Hoffe Ihr könnt mir vll helfen.

Das ist mein erstes Script.

 Set Rechner=AKEEE01
call EEEPC_Backup.cmd %Rechner%
Set Rechner=AKEEE02
Call EEEPC_Backup.cmd %Rechner% 

Das ist das Zweite Script

Title EEEPC_Backup
echo ############################################################# >> 

\\XP\E$\EEEPC_Backup\log.txt
echo. | date | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  
echo. | time | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  

if exist \\%Rechner%\C$\MES\ goto :ping else goto :error2

:ping
ping -n 2 -i 255 -w 130 %Rechner% >> \\XP\E$\EEEPC_Backup\log.txt

if %errorlevel% == 0 goto :exist
if %errorlevel% == 1 goto :error

:exist

if exist \\XP\E$\EEEPC_Backup\%Rechner%\ goto :copy else goto :create

:create
xcopy \\%Rechner%\c$\MES\* \\XP\E$\EEEPC_Backup\%Rechner%\* /T /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

goto :copy

:copy

xcopy \\%Rechner%\c$\MES\* \\XP\E$\EEEPC_Backup\%Rechner%\*  /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\config\* \\XP\E$\EEEPC_Backup\%Rechner%\config\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\dll\* \\XP\E$\EEEPC_Backup\%Rechner%\dll\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\lib\* \\XP\E$\EEEPC_Backup\%Rechner%\lib\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\resources\* \\XP\E$\EEEPC_Backup\%Rechner%\resources\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\logs\*.zip \\XP\E$\EEEPC_Backup\%Rechner%\logs\*.zip /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

echo ############################################################## >> 

\\XP\E$\EEEPC_Backup\log.txt
exit

:error
echo Das Programm hat einen Fehler beim Kopieren festgestellt und wurde vorzeitig beendet>> 

\\XP\E$\EEEPC_Backup\log.txt

echo ############################################################## >> 

\\XP\E$\EEEPC_Backup\log.txt

echo Das Programm hat einen Fehler beim Kopieren festgestellt und wurde vorzeitig beendet>> 

\\XP\E$\EEEPC_Backup\errorlog.txt
echo ############################################################## >> 

\\XP\E$\EEEPC_Backup\errorlog.txt
exit

:error2
echo Das Verzeichnis mes auf %Rechner% existiert nicht und kann deswegen nicht kopiert 

werden >> \\XP\E$\EEEPC_Backup\log.txt
echo Das Verzeichnis mes auf %Rechner% existiert nicht und kann deswegen nicht kopiert 

werden >> \\XP\E$\EEEPC_Backup\errorlog.txt
echo ############################################################## >> 

\\XP\E$\EEEPC_Backup\errorlog.txt
exit 

Content-ID: 173802

Url: https://administrator.de/forum/batch-ueber-eine-andere-batch-mit-parametern-starten-173802.html

Ausgedruckt am: 26.12.2024 um 01:12 Uhr

pieh-ejdsch
pieh-ejdsch 28.09.2011 um 09:59:28 Uhr
Goto Top
moin ITSchlumpf,

es würde auch eine Batch reichen wobei ein Call in eine Sprungmarke genauso abläuft wie ein Call in einen anderen Batch.

die massiven Umleitungen in die LOG kannst Du gleich bei dem Call angeben, somit ersparst Du Dir einige Zeilen bzw. jedesmal denselben Text.

for %%i in ("Servera" "ServerB") do call :Backup %%i 1>> "\\XP\E$\EEEPC_Backup\log.txt" 2>> "\\XP\E$\EEEPC_Backup\errorlog.txt"  

goto :eof

:Backup
Title EEEPC_Backup %1
echo #############################################################
echo. | date | find "Aktuell"  
echo. | time | find "Aktuell"  

set "Rechner=%~1"  
if NOT exist \\%Rechner%\C$\MES\ goto :error2

:ping
ping -n 2 -i 255 -w 130 %Rechner%

if %errorlevel% == 1 goto :error

:exist

if exist \\XP\E$\EEEPC_Backup\%Rechner%\ goto :copy

:create
xcopy \\%Rechner%\c$\MES\* \\XP\E$\EEEPC_Backup\%Rechner%\* /T /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\MES\* \\XP\E$\EEEPC_Backup\%Rechner%\*  /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\config\* \\XP\E$\EEEPC_Backup\%Rechner%\config\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\dll\* \\XP\E$\EEEPC_Backup\%Rechner%\dll\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\lib\* \\XP\E$\EEEPC_Backup\%Rechner%\lib\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\resources\* \\XP\E$\EEEPC_Backup\%Rechner%\resources\* /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

xcopy \\%Rechner%\c$\mes\logs\*.zip \\XP\E$\EEEPC_Backup\%Rechner%\logs\*.zip /Y /D
if %errorlevel% == 2 goto :error
if %errorlevel% == 4 goto :error
if %errorlevel% == 5 goto :error

echo ############################################################## 

exit /b

:error
echo Das Programm hat einen Fehler beim Kopieren festgestellt und wurde vorzeitig beendet
echo ##############################################################
>&2 echo Das Programm hat einen Fehler beim Kopieren festgestellt und wurde vorzeitig beendet
>&2 echo ##############################################################


exit /b

:error2

echo Das Verzeichnis mes auf %Rechner% existiert nicht und kann deswegen nicht kopiert werden
echo ##############################################################

>&2 echo Das Verzeichnis mes auf %Rechner% existiert nicht und kann deswegen nicht kopiert werden
>&2 echo ##############################################################

exit /b

ein exit ohne /b sollte nur gemacht werden wenn die Instanz(Umgebung) geschlossen werden soll.

[Edit]@ Markus nicht zu spät, sondern auch noch ergänzt..
wegen dem IF - Klammern vor die ELSE gesetzt.um zu funktionieren
[/Edit]
[Edit2] die else Klauseln entfernt da unnötig [/Edit2]
Gruß Phil
BigWim
BigWim 28.09.2011 um 10:11:15 Uhr
Goto Top
Moin ITSchlumpf,

Zum Problem.

In zweiten Script kommen die Parameter in %1, %2, usw. weiter an.
d. h. im zweiten Script muss mindestens etwas derartiges stehen:

Title EEEPC_Backup
Set Rechner=%1
echo ############################################################# >> 

\\XP\E$\EEEPC_Backup\log.txt
echo. | date | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  
echo. | time | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  
.
.


Vorschlag
Du kannst das ganze auch in einem Script abhandeln.

Du schreibst die Rechnernamen in eine einfache Textdatei namens Rechner.txt. Zum Beispiel so
AKEEE01
AKEEE02

und machst Dein zweites Script wieder zum ersten Script mit der ungetesteten Ergänzung:

Title EEEPC_Backup
Set Serverliste=Rechner.txt

for /f %%r in (%Serverliste%) do call :Main %%r
goto :eof

:Main
Set Rechner=%1
echo ############################################################# >> 

\\XP\E$\EEEPC_Backup\log.txt
echo. | date | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  
echo. | time | find "Aktuell" >> \\XP\E$\EEEPC_Backup\log.txt  

if exist \\%Rechner%\C$\MES\ goto :ping else goto :error2

:ping
ping -n 2 -i 255 -w 130 %Rechner% >> \\XP\E$\EEEPC_Backup\log.txt

if %errorlevel% == 0 goto :exist
if %errorlevel% == 1 goto :error

:exist

if exist \\XP\E$\EEEPC_Backup\%Rechner

Gruß
Markus

[Edit] Wieder zu langsam geschrieben ...[/Edit]
ITSchlumpf
ITSchlumpf 28.09.2011 um 10:53:07 Uhr
Goto Top
Hallo ihr zwei,

danke für die Fixe hilfe. Werd es so bald als möglich testen, aber sieht schon recht gut aus. Das mit der Schleife hatte ich auch mal gesehen aber wusste nicht genau wie.

Noch ne kurze frage zu der Schleife. Die Variable %%r ist dann die Variable mit den Rechnernamen oder sehe ich das falsch?

Vielen dank.

Gruß
Schlumpf
BigWim
BigWim 28.09.2011 um 12:46:16 Uhr
Goto Top
Moin ITSchlumpf,

Die Variable %%r ist dann die Variable mit den Rechnernamen
Ja.
oder sehe ich das falsch?
Nein.

Die For-Schleife liest die Datei zeilenweise und pro Zeile wird dann :Main aufgerufen.
Hier im Forum gibt es Superanleitungen zur .

Gruß
Markus
ITSchlumpf
ITSchlumpf 28.09.2011 um 13:31:32 Uhr
Goto Top
Also habe es gerade mal getestet und leider funktioniert es nicht face-sad

Beim Start in die Schleife bricht er sofort ab. woran kann das liegen? Ö.ö

Gruß
Schlumpf

[edit] also habe grad mal noch rumprobiert, und er läuft in die Schleife rein bricht dann aber schlagartig ab. [/Edit]

[Edit] Problem gefunden. nur ne Lösung habe ich dafür noch nicht. Er übergibt die Variable %%r nicht in die Abfragen.[/Edit]

[Edit] So sry habs problem gelöst. Wer lesen kann ist klar im Vorteil. Hatte ausversehen mit der %%r in den abfragen gearbeitet anstatt %1 für den 1. Parameter zu nutzen. *Kopf -> Tisch* [/Edit]

Programm läuft jetzt sauber durch. Danke nochmal face-smile

Gruß

Schlumpf
ITSchlumpf
ITSchlumpf 28.09.2011 um 14:26:53 Uhr
Goto Top
Zu früh gefreut. Jetzt ist das Programm grad durchgelaufen und steigt nach dem ersten durchlauf aus. Der Ignoriert die Schleife bzw. weiß net das er wieder oben anfangen muss so wie das aussieht.
BigWim
BigWim 28.09.2011 um 14:34:06 Uhr
Goto Top
Moin ITSchlumpf,

Zu früh gefreut.
Dann müßtest Du jetzt mal den Anfang des Scriptes posten.

Denn ich habe die Kurzfassung ausprobiert und ich kann keinen Fehler feststellen.
Oder vielleicht schaust Du selbst noch einmal ....

Gruß
Markus

Hier die getestete Kurzfassung:
@echo off & Setlocal
Set Serverliste=Rechner.txt

for /f %%r in (%Serverliste%) do call :Main %%r
goto :eof

:Main
Set Rechner=%1
echo %Rechner%

[Edit]
Wenn Du gemäß obigen Post noch in Zeile 80 (oder tiefer) das exit /b hast - das muß natürlich raus bzw. besser durch ein goto :eof ersetzt werden!
[/Edit]
ITSchlumpf
ITSchlumpf 28.09.2011 um 14:42:02 Uhr
Goto Top
Hab es so auch getestet als es nicht ging und da lief er schön durch aber jetzt bricht er mir nach einem durchlauf ab.
Was bewirkt das SetLocal?

Title EEEPC_Backup
Set Serverliste=EEEPC.txt

for /f %%r in (%Serverliste%) do call :Main %%r

:Main 
Set Rechner=%1


Gruß
Schlumpf
BigWim
BigWim 28.09.2011 um 14:47:35 Uhr
Goto Top
Was bewirkt das SetLocal?
Dann brauche ich die Variablen am Ende Scripts nicht mehr zu löschen
z. B. Set Serverliste=

Mehr Details
Setlocal /?

Gruß
Markus
BigWim
BigWim 28.09.2011 um 14:59:22 Uhr
Goto Top
Vielleicht war ich mit meiner nachträglichen Änderung des Beitrags zu spät.

Deshalb noch einmal so

[Edit]
Wenn Du gemäß obigen Post noch in Zeile 80 (oder tiefer) das exit /b hast - das muß natürlich raus bzw. besser durch ein goto :eof ersetzt werden!
[/Edit]


Gruß
Markus
ITSchlumpf
ITSchlumpf 28.09.2011 um 15:03:49 Uhr
Goto Top
Das hab ich grad vorher gesehen und es mir eig auch schon gedacht, dass die ja eig mein Programm dann abbrechen und raus müssen face-smile
Jetzt wollte ich grad mal das ganze abgespeckt testen und bekomme die Fehlermeldung "unzulässige Parameteranzahl" obwohl der Befehl in der kompletten Batch durch läuft.

 @echo off & Setlocal 
Set Serverliste=EEEPC.txt 

for /f %%r in (%Serverliste%) do call :Main %%r 

goto :eof 

:Main 
Set Rechner=%1 
xcopy \\%Rechner%\c$\rqm-mes\* \\xp91\C$\EEEPC_Backup\%Rechner%\* /T /Y /D

pause

Ist bestimmt mal wieder ein ganz kleines Problem.

[Edit] Also Batch will mich glaub verarschen. In der Backup Batch laufen die Befehle durch ohne Problem und in einer abgespeckten Variante mit lediglich den copy befehlen bekomme ich Fehlermeldungen. Komisch. [/Edit]
BigWim
BigWim 28.09.2011 um 15:27:29 Uhr
Goto Top
Jetzt wollte ich grad mal das ganze abgespeckt testen und bekomme die Fehlermeldung "unzulässige Parameteranzahl"
In solchen Fällen stört natürlich ein echo off. Bei Fehlersuche in ein echo on Pflicht!

Ist bestimmt mal wieder ein ganz kleines Problem.
Werden wir dann ja sehen face-wink

Gruß
Markus
ITSchlumpf
ITSchlumpf 28.09.2011 um 15:45:21 Uhr
Goto Top
Kann es sein, dass ich der For-Schleife einen Rücksprung punkt geben muss. Also wie bei Java z.B. { }. Weil mir ist jetzt aufgefallen, dass das Programm nach dem letzten Befehl in dem :Main Bereich (eintrag in das logfile) direkt abbricht. Habe danach ein Pause gesetzt und das liest er schon garnicht mehr.
BigWim
BigWim 28.09.2011 um 15:56:17 Uhr
Goto Top
Kann es sein, dass ich der For-Schleife einen Rücksprung punkt geben muss
Nein, die Syntax ist schon so richtig. Sonst würde ja die Kurzfassung auch nicht funktionieren.

Setz vor dem xcopy ein echo und Du wirst sehen, dass für jede Zeile in der EEEPC.txt eine Ausgabe erfolgt.
Hast Du die Befehlsanzeige wieder eingeschaltet und die Ausgaben geprüft?

Gruß
Markus
ITSchlumpf
ITSchlumpf 28.09.2011 um 16:00:47 Uhr
Goto Top
Memo an mich selbst, arbeite nicht mehr mit dem Notepad sondern nur noch mit Notepad++ -.-
Also Problem gelöst, lag nur an der formatierung vom Notepad der hat das etwas gestückelt. Einmal mit Notepad++ aufmachen reinschauen sehen ah ja da hängt was nicht mehr zusammen und schon geht alles wieder. Es ist getestet und funktioniert.

Danke für die tolle Unterstützung.

Gruß

Schlumpf
BigWim
BigWim 29.09.2011 um 08:33:48 Uhr
Goto Top
Moin ITSchlumpf

kannst Du bitte den Beitrag auf gelöst setzen.

Danke für die tolle Unterstützung.
Gern geschehen. Und weiter viel Erfolg


Gruß
Markus
ITSchlumpf
ITSchlumpf 29.09.2011 um 10:17:38 Uhr
Goto Top
Ups total vergessen. Danke fürs erinnern face-smile