Mehrere Dateien (.cmd) einzel aufrufen mit Batch oder Shell Programm
Ich habe mehrere Dateien (Anzahl ist variabel) diese haben eine bestimmte Dateinamen rechnername1.cmd , rechnername2.cmd u.sw. wie kann ich mit einem Batch oder Shell Programm diese Dateien einzel abarbeiten und dann am besten verschieben in einen Ordner "erledigte Arbeiten" (muss aber nicht sein) mein hauptanliegen ist das aufrufen der Dateien. jede Datei soll nur einmal abgearbeitet werden. Das Problem was ich habe ist, das ich nicht vorher weiß wieviele Dateien vorhanden sind. (Die Dateien werden von einer Datenbank erstellt)
Für jede Hilfe bin ich dankbar.
Gruss
Turbohawk
Für jede Hilfe bin ich dankbar.
Gruss
Turbohawk
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 15270
Url: https://administrator.de/contentid/15270
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
17 Kommentare
Neuester Kommentar
Moin turbohawk,
am simpelsten mit einer FOR...IN ..DO-Schleife:
HTH
Frank / der Biber aus Bremen
am simpelsten mit einer FOR...IN ..DO-Schleife:
::----skizze CallAllCMDsInDir.bat
@echo off & setlocal
Set Workdir=Verzeichnis\Wo\Die\Batchdateien\Sind
Set BatchesSaveDir=Verzeichnis\wo\Gelaufene\Bätche\hin\verschoben\werden
FOR /F %%a IN ('dir /b %workDir%') DO call :loop %%a
goto :ThatsAllFolks
:loop
Call %~f1
if Errorlevel 1 (
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
goto :eof
) ELSE (
COPY /y %~f1 %BatchesSaveDir% >nul
del /y %~f1 >nul
)
goto :eof
:ThatsAllFolks
:: ------ Ende der SkizzeCallAllCMDsInDir.bat --- ** UNGETESTET --- **
Frank / der Biber aus Bremen
Moin,
wäre wichtig zu wissen, unter welchem Betribssystem das laufen soll. Gerade die Batchbefehle sind nicht unbedingt kompatibel. Speziell XP hat etliche Erweiterungen, die z.B. in W2K nicht funktionieren.
wäre wichtig zu wissen, unter welchem Betribssystem das laufen soll. Gerade die Batchbefehle sind nicht unbedingt kompatibel. Speziell XP hat etliche Erweiterungen, die z.B. in W2K nicht funktionieren.
@turbohawk
Funktioniert es, soll ich noch was erläutern oder bist Du noch ohnmächtig?
Funktioniert es, soll ich noch was erläutern oder bist Du noch ohnmächtig?
dann schau Dir mal beispielsweise den SET-Befehl an
@16640
..der ist mir zu komplex, der SET-Befehl ... ich übe erstmal mit einfachen Befehlen.
Für diese Woche hab ich mir den Befehl "PAUSE" vorgenommen. Der hat nicht so viele Parameter..
(Aber zum SET-Befehl wüsste ich auch noch ein paar undokumentierte Features *gg)
Im Ernst:
Ein großer Sprung der CMD-Erweiterungen war tatsächlich, da geb ich Dir Recht, dba, aber von W98/WinNT/WinME auf W2000/2003/XP. Nicht von W2K auf XP.
Ich werde dran denken, dass ich das vielleicht mal erwähne, wenn der/die FragestellerIn nicht klar zu erkennen gibt, dass er/sie wenigstens bei W2k angekommen ist.
Denn unter W98 laufen die meisten meiner Bätchelchen NICHT. *zugeb
..der ist mir zu komplex, der SET-Befehl ... ich übe erstmal mit einfachen Befehlen.
Für diese Woche hab ich mir den Befehl "PAUSE" vorgenommen. Der hat nicht so viele Parameter..
(Aber zum SET-Befehl wüsste ich auch noch ein paar undokumentierte Features *gg)
Im Ernst:
Ein großer Sprung der CMD-Erweiterungen war tatsächlich, da geb ich Dir Recht, dba, aber von W98/WinNT/WinME auf W2000/2003/XP. Nicht von W2K auf XP.
Ich werde dran denken, dass ich das vielleicht mal erwähne, wenn der/die FragestellerIn nicht klar zu erkennen gibt, dass er/sie wenigstens bei W2k angekommen ist.
Denn unter W98 laufen die meisten meiner Bätchelchen NICHT. *zugeb
Moin Turbohawk,
sollte ja auch nur eine Skizze sein... Also:
Änderungen in fett . Nur die pushd/popd-Mimik war wichtig; der Rest ist Prio 2/ Nebensache. Ich hatte mir zwar in der ersten Skizze das %workDir% gemerkt, aber nichts damit gemacht.
Schlamperei gibt frei- & reumütig zu
Frank / der Biber aus Bremen
sollte ja auch nur eine Skizze sein... Also:
@echo off
setlocal
<b>Set "Workdir=e:\oracle\logmnr\new"
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"
pushd %Workdir% </b>
FOR /F %%a IN ('dir /b %WorkDir%<b>\*.cmd</b>') DO call :loop %%a
<b>popd
goto end</b>
:loop
Call %~f1
::pause
if Errorlevel 1 (
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
goto :eof
) ELSE (
Echo (Debug) Alles ok, %~f1 wird verschoben...
COPY /y %~f1 %BatchesSaveDir% >nul
del /y %~f1 >nul
)
goto :eof
<b>------die Zeile sollte raus!! :eof </b>
:end
echo das war alles
pause
Schlamperei gibt frei- & reumütig zu
Frank / der Biber aus Bremen
Menno, Turbohawk,
wenn Du Doch mit Bätchen nicht der Guru bist - ist ja nicht schlimm, ich beispielsweise verstehe nichts von Seidenmalerei oder weiß auch nicht, wer bei BigBrother mitspielt- also, wenn Du da nicht so geübt bist, dann mach nicht die Batchzeilen optisch schöner.
Ein Problem war folgendes:
...Kopier das Beispiel als Test.bat und lass es laufen. Brezelt ab.
Und nun nochmal in der zweiten Zeile die drei Buchstaben REM löschen. ( REM ist NICHT die Abkürzung für Rapid Eye Movement)
Wie Du siehst, geht der CMD-Interpreter bei "IF ERRORLEVEL 1 " nicht davon aus, das evtl in der Folgezeile noch was kommen kann.
Macht er nur, wenn eine Klammer in derselben Zeile ist. Das war das Hauptproblem.
Zum anderen (bei dem Mini-Batch vielleicht noch nicht verheerend, aber bei Scripten mit 30 Zeilen oder mehr schon gefährlich):
1) aus der FOR-Schleife wird mit call :loop ... der "Block" namens ":loop" aufgerufen. Der sollte mit einem "goto :eof" abgeschlossen sein. Das entspricht einem "Return" oder "End Sub" in anderen (Script-)Sprachen.
2) Der Haupt-Teil des oberen "CallAllCmdsInDir"-Batches ist nach dem "POPD" zu Ende. Kann der CMD-Interpreter aber nicht wissen. Der würde einfach nochmal über die Zeilen ":loop" und folgende wackeln, wenn er soweit käme. Also: nach der POPD-Zeile auch ein "goto :eof" rein.
Hatte ich auch oben so geschrieben, dachte ich. *konnteichmirnichtverkneifenjetzt*
Übrigens - es gibt auch direkt zu allen CMD-Befehlen Hilfe vo,m Prompt aus.
Einfach "HELP" für eine Übersicht oder "HELP IF" oder "IF /? ", wenn Du Hilfe zum IF-Befehl brauchst.
Ist nicht böse gemeint, aber ich hab mir das auch anlesen müssen - weder Eltern noch Lehrer haben mir etwas zu Computern erzählen können.
Und vielleicht hätte ich auch wirklich lieber Bäcker werden sollen.
Schönes Wochenende
Biber
P.S. Wenn es dich tröstet: ich schreibe am liebsten einzeilige Batchdateien. Vermindert die Syntaxfehlergefahr in einer vierten ode fünften Zeile immens.
Hab schon eine ganze Sammlung "144 Admin-Oneliner" *gg
wenn Du Doch mit Bätchen nicht der Guru bist - ist ja nicht schlimm, ich beispielsweise verstehe nichts von Seidenmalerei oder weiß auch nicht, wer bei BigBrother mitspielt- also, wenn Du da nicht so geübt bist, dann mach nicht die Batchzeilen optisch schöner.
Ein Problem war folgendes:
@echo off
REM goto machsRichtig
md 2>nul
echo Errorlevel bei md ohne Parameter ist: %errorlevel%
if Errorlevel 1
(
echo bin im Zweig Fehlerfall!!
)
ELSE
(
Echo bin im Zweig kein Fehler..
pause
)
:machsrichtig
md 2>nul
echo Errorlevel bei md ohne Parameter ist: %errorlevel%
if Errorlevel 1 (
echo bin im Zweig Fehlerfall!!
) ELSE (
Echo bin im Zweig kein Fehler..
pause
)
Und nun nochmal in der zweiten Zeile die drei Buchstaben REM löschen. ( REM ist NICHT die Abkürzung für Rapid Eye Movement)
Wie Du siehst, geht der CMD-Interpreter bei "IF ERRORLEVEL 1 " nicht davon aus, das evtl in der Folgezeile noch was kommen kann.
Macht er nur, wenn eine Klammer in derselben Zeile ist. Das war das Hauptproblem.
Zum anderen (bei dem Mini-Batch vielleicht noch nicht verheerend, aber bei Scripten mit 30 Zeilen oder mehr schon gefährlich):
1) aus der FOR-Schleife wird mit call :loop ... der "Block" namens ":loop" aufgerufen. Der sollte mit einem "goto :eof" abgeschlossen sein. Das entspricht einem "Return" oder "End Sub" in anderen (Script-)Sprachen.
2) Der Haupt-Teil des oberen "CallAllCmdsInDir"-Batches ist nach dem "POPD" zu Ende. Kann der CMD-Interpreter aber nicht wissen. Der würde einfach nochmal über die Zeilen ":loop" und folgende wackeln, wenn er soweit käme. Also: nach der POPD-Zeile auch ein "goto :eof" rein.
Hatte ich auch oben so geschrieben, dachte ich. *konnteichmirnichtverkneifenjetzt*
Übrigens - es gibt auch direkt zu allen CMD-Befehlen Hilfe vo,m Prompt aus.
Einfach "HELP" für eine Übersicht oder "HELP IF" oder "IF /? ", wenn Du Hilfe zum IF-Befehl brauchst.
Ist nicht böse gemeint, aber ich hab mir das auch anlesen müssen - weder Eltern noch Lehrer haben mir etwas zu Computern erzählen können.
Und vielleicht hätte ich auch wirklich lieber Bäcker werden sollen.
Schönes Wochenende
Biber
P.S. Wenn es dich tröstet: ich schreibe am liebsten einzeilige Batchdateien. Vermindert die Syntaxfehlergefahr in einer vierten ode fünften Zeile immens.
Hab schon eine ganze Sammlung "144 Admin-Oneliner" *gg
Na, Turbohawk,
wenn wir nicht mal zu zweit so einen Kasperbatch zum Fliegen kriegen, sollten wir wirklich wohl kleine Brötchen backen *gg
Ich seh jetzt mit bloßem Auge nicht, woran es denn scheitern könnte, aber dass könnte auch auch an einem von den letzten Becks liegen..
Vorschlag zur Güte:
Mach erstmal einen So-tun-als-ob-Batch daraus, d.h.
1.Zeile (@echo off) ein REM davor und
2. in dem :loop-Block auch ....
:loop
echo Call %~f1
::pause
if Errorlevel 1 (
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
goto :eof
) ELSE (
Echo (Debug) Alles ok, %~f1 wird verschoben...
REM COPY /y %~f1 %BatchesSaveDir% >nul
REM del /y %~f1 >nul
echo COPY /y %~f1 %BatchesSaveDir%
echo del /y %~f1
)
(alles andere so lassen.. Nur damit zu sehen ist, wo er gegen die Wand läuft)
Ich mach das auch mal nachher... will nur kurz ein Nickerchen machen..
Muss was Banales sein - hast Du vielleicht einen Atari oder eine Playstation?
Leg Dich auch erstmal hin ... bis später.
P.S. ist ja peinlich vor all den Leuten... die schieben uns bestimmt ins OffTopic...
wenn wir nicht mal zu zweit so einen Kasperbatch zum Fliegen kriegen, sollten wir wirklich wohl kleine Brötchen backen *gg
Ich seh jetzt mit bloßem Auge nicht, woran es denn scheitern könnte, aber dass könnte auch auch an einem von den letzten Becks liegen..
Vorschlag zur Güte:
Mach erstmal einen So-tun-als-ob-Batch daraus, d.h.
1.Zeile (@echo off) ein REM davor und
2. in dem :loop-Block auch ....
:loop
echo Call %~f1
::pause
if Errorlevel 1 (
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
goto :eof
) ELSE (
Echo (Debug) Alles ok, %~f1 wird verschoben...
REM COPY /y %~f1 %BatchesSaveDir% >nul
REM del /y %~f1 >nul
echo COPY /y %~f1 %BatchesSaveDir%
echo del /y %~f1
)
(alles andere so lassen.. Nur damit zu sehen ist, wo er gegen die Wand läuft)
Ich mach das auch mal nachher... will nur kurz ein Nickerchen machen..
Muss was Banales sein - hast Du vielleicht einen Atari oder eine Playstation?
Leg Dich auch erstmal hin ... bis später.
P.S. ist ja peinlich vor all den Leuten... die schieben uns bestimmt ins OffTopic...
Sorry, Turbohawk,
war mein Fehler. Zuviel Becks, zu wenig Schlaf.
Habe folgenden TurboTest.bat laufen lassen (Ausgabe und Doku ist gleich mit drin)
Problem war: ich hatte in der "Echo (Debug) bla.." -Zeile die Klammern nicht maskiert/nicht als Nicht-Steuerzeichen kenntlich gemacht.
Depp, ich. *Schäm*
Außerdem hab ich noch die "%~f1"-Variablen durch die lesbareren "%1" ersetzt (ist aber egal, funktioniert beides, aber das "~f1" ist nicht nötig.)
Schönes Rest-Wochenende
Biber
war mein Fehler. Zuviel Becks, zu wenig Schlaf.
Habe folgenden TurboTest.bat laufen lassen (Ausgabe und Doku ist gleich mit drin)
@echo off
setlocal
Set "Workdir=e:\oracle\logmnr\new"
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"
Set "Workdir=d:\temp2" & REM Diese Zeile kannst du wegwerfen
Set "BatchesSaveDir=d:\temp" & REM Diese Zeile kannst du wegwerfen
(Echo ...##Debug## dir /b %Workdir%\*.cmd:) & REM Diese Zeile kannst du wegwerfen
dir /b %Workdir%\*.cmd & REM Diese Zeile kannst du wegwerfen
pushd %Workdir%
FOR /F %%a IN ('dir /b %WorkDir%\*.cmd') DO call :loop %%a
popd
goto :eof
-----------------------Ende Hauptprogramm
:loop
Call %1
::pause
if Errorlevel 1 (
echo %1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
goto :eof
) ELSE (
Echo ........##Debug## Alles ok, %1 wird verschoben...
ECHO COPY /y %1 %BatchesSaveDir% rem
rem >nul
ECHO del %1
rem >nul
)
goto :eof
--------------------------
Inhalt von CalledCmd1.Cmd (und CalledCmd2 und CalledCmd3) sind 2 Zeilen:
@echo off & echo hier beginnt %0
For /L %%i in (1, 1, 100000) do if %%i==100000 echo %0 ist fertig...
--------ende CalledCmds
Ausgabe von Turbotest.bat:
------------
D:\temp>
>Turbotest.bat
...##Debug## dir /b d:\temp2\*.cmd:
CalledCmd1.cmd
CalledCmd2.cmd
CalledCmd3.cmd
hier beginnt CalledCmd1.cmd
CalledCmd1.cmd ist fertig...
........##Debug## Alles ok, CalledCmd1.cmd wird verschoben...
COPY /y CalledCmd1.cmd d:\temp rem
del CalledCmd1.cmd
hier beginnt CalledCmd2.cmd
CalledCmd2.cmd ist fertig...
........##Debug## Alles ok, CalledCmd2.cmd wird verschoben...
COPY /y CalledCmd2.cmd d:\temp rem
del CalledCmd2.cmd
hier beginnt CalledCmd3.cmd
CalledCmd3.cmd ist fertig...
........##Debug## Alles ok, CalledCmd3.cmd wird verschoben...
COPY /y CalledCmd3.cmd d:\temp rem
del CalledCmd3.cmd
D:\temp>
Depp, ich. *Schäm*
Außerdem hab ich noch die "%~f1"-Variablen durch die lesbareren "%1" ersetzt (ist aber egal, funktioniert beides, aber das "~f1" ist nicht nötig.)
Schönes Rest-Wochenende
Biber