turbohawk
Goto Top

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

Content-ID: 15270

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

Biber
Biber 01.09.2005 um 08:48:41 Uhr
Goto Top
Moin turbohawk,

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 --- **
HTH
Frank / der Biber aus Bremen
16640
16640 01.09.2005 um 08:52:43 Uhr
Goto Top
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.
Biber
Biber 01.09.2005 um 09:07:48 Uhr
Goto Top
@16640
uuups..*geschockt bin*

Welche CMD-Erweiterungen hat XP denn?? Habe ich noch gar nicht mitbekommen.... face-big-smile

Die Skizze oben ist gleichermaßen ungetestet unter W2K, W2003Server, XP Home und XP-Prof (alle SPs) und läuft unter allen, wenn die Tippfehler draußen sind.

Schwört vor Zeugen
Biber
Biber
Biber 01.09.2005 um 17:06:58 Uhr
Goto Top
@turbohawk
Funktioniert es, soll ich noch was erläutern oder bist Du noch ohnmächtig?
16640
16640 01.09.2005 um 17:09:33 Uhr
Goto Top
face-wink dann schau Dir mal beispielsweise den SET-Befehl an
Biber
Biber 01.09.2005 um 17:29:32 Uhr
Goto Top
@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
turbohawk
turbohawk 01.09.2005 um 23:38:32 Uhr
Goto Top
So habe die datei eingebunden bekomme aber immer eine Fehlermeldung.

/code

@echo off
setlocal
Set Workdir=e:\oracle\logmnr\new\
Set BatchesSaveDir=e:\commandfiles\commandfiles-old
FOR /F %%a IN ('dir /b %WorkDir%') DO call :loop %%a

:loop

Call %~f1
pause
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

:eof
echo das war alles
pause
end

/code ende

die Fehlermeldung lautet:
'E:\dhegmann.cmd' is not recognized as an internal or external command,
operable program or batch file.

wobei dhegmann.cmd die datei ist die ich ausführen möchte
kann einer helfen ???
Biber
Biber 02.09.2005 um 09:27:23 Uhr
Goto Top
Moin Turbohawk,

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  
Ä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
turbohawk
turbohawk 03.09.2005 um 01:28:42 Uhr
Goto Top
Ich weiß nicht was ich falsch mache ??

-- code --

@echo off
setlocal
Set "Workdir=e:\oracle\logmnr\new"
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"
pushd %Workdir%
FOR /F %%a IN ('dir /b %WorkDir%\*.cmd') DO call :loop %%a
popd


:loop
Call %~f1
pause
if Errorlevel 1
(
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.
)
ELSE
(
Echo (Debug) Alles ok, %~f1 wird verschoben...
COPY /y %~f1 %BatchesSaveDir% >nul
del /y %~f1 >nul
pause
)

--code ende ---

eine datei wird ausgeführt aber die andere nicht ich hab mal nach call eine pause eingerührt es sieht so aus das der code nur einmal dürchläuft und danach beendet wird.

es sind sber 2 datei im verzeichnis die andere datei wird nicht ausgeführt.

das kopiern klappt auch nicht kannst du vielleicht nochmal helfen "Biber" ich hab keine Ahnung von batch programieren.

Gruss Turbohawk
Biber
Biber 03.09.2005 um 03:47:01 Uhr
Goto Top
Menno, Turbohawk,
face-wink
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 
)
...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
turbohawk
turbohawk 03.09.2005 um 04:07:18 Uhr
Goto Top
Hab es genau so gemacht wie beschrieben klappt aber immer noch nicht nur die erste cmd datei wird aufgerufen die zweite nicht das kopieren und löschen klappt auch nicht ???

-- code --

@echo off
setlocal
Set "Workdir=e:\oracle\logmnr\new"
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"
pushd %Workdir%
FOR /F %%a IN ('dir /b %WorkDir%\*.cmd') DO call :loop %%a
popd
goto :eof

: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

-- code ende --

was ist daran jetzt falsch ??
mit der hilfe war ein guter tip aber unter for /? versteht ich nur bahnhof
Ich glaub computer sind nix für mich !!!

hätte Bäcker werden sollen.

Gruss turbohawk und danke für deine Hilfe
Biber
Biber 03.09.2005 um 05:11:36 Uhr
Goto Top
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? face-big-smile
Leg Dich auch erstmal hin ... bis später.
P.S. ist ja peinlich vor all den Leuten... die schieben uns bestimmt ins OffTopic...
turbohawk
turbohawk 03.09.2005 um 05:37:48 Uhr
Goto Top
Hab deine Tips befolgt :

folgende Ausgabe habe ich bekommen:

E:\>setlocal

E:\>Set "Workdir=e:\oracle\logmnr\new"

E:\>Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"

E:\>pushd e:\oracle\logmnr\new

E:\Oracle\logmnr\new>FOR /F %a IN ('dir /b e:\oracle\logmnr\new\*.cmd') DO call

E:\Oracle\logmnr\new>call :loop dhegmann.cmd

E:\Oracle\logmnr\new>echo Call E:\Oracle\logmnr\new\dhegmann.cmd
Call E:\Oracle\logmnr\new\dhegmann.cmd

E:\Oracle\logmnr\new>pause
Press any key to continue . . .


Die Pause hab ich noch reingesetzt damit ich was sehe.
Wie Du siehst ruf er die erste datei auf und dann steht was von pause ???
warum arbeitet die Schleife nicht mehr ab ??

Werde erst wieder am Montag früh weiter probieren können (endlich wochenende und keine Nachtschicht mehr Gott sei Dank !!!)

Trotzdem danke für deine Bemühungen

Gruss
Turbohawk
Biber
Biber 03.09.2005 um 23:45:44 Uhr
Goto Top
Sorry, Turbohawk,
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>
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
turbohawk
turbohawk 05.09.2005 um 07:00:35 Uhr
Goto Top
Danke !!! Bieber Du bist mein Retter & held hat alles sehr gut geklappt.
Mehr Leute wie Dich muss das Forum haben.

Gruss
turbohawk
Biber
Biber 05.09.2005 um 09:32:00 Uhr
Goto Top
@turbi
*rotwerd*
Danke für das Kompliment - und: das Forum hat eine Menge solcher Leute. face-wink

Frank / der (Rot-)Biber aus Bremen
OneAdmin
OneAdmin 26.04.2006 um 18:48:29 Uhr
Goto Top
Per Shell-Skript eine Dateiliste erstellen e.g DIR > name.txt
Dann die Dateiliste mit dem FOR-Befehl einlesen und verarbeiten.
Am besten zwei Shell-Skripte schreiben.
Skript 1 mit dem FOR-Befehl ruft Skripte 2 auf, übergibt alle erforderlichen Parameter und verarbeitet die Dateien