Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mehrere Dateien (.cmd) einzel aufrufen mit Batch oder Shell Programm

Frage Entwicklung Batch & Shell

Mitglied: turbohawk

turbohawk (Level 1) - Jetzt verbinden

01.09.2005, aktualisiert 26.04.2006, 11269 Aufrufe, 17 Kommentare

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
Mitglied: Biber
01.09.2005 um 08:48 Uhr
Moin turbohawk,

am simpelsten mit einer FOR...IN ..DO-Schleife:

01.
::----skizze CallAllCMDsInDir.bat 
02.
@echo off & setlocal 
03.
Set Workdir=Verzeichnis\Wo\Die\Batchdateien\Sind 
04.
Set BatchesSaveDir=Verzeichnis\wo\Gelaufene\Bätche\hin\verschoben\werden 
05.
FOR /F %%a IN ('dir /b %workDir%') DO call :loop %%a 
06.
goto :ThatsAllFolks 
07.
 
08.
:loop 
09.
Call %~f1 
10.
if Errorlevel 1  ( 
11.
  echo  %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht. 
12.
  goto :eof 
13.
) ELSE ( 
14.
COPY /y %~f1 %BatchesSaveDir% >nul 
15.
del /y %~f1 >nul 
16.
17.
goto :eof 
18.
 
19.
:ThatsAllFolks 
20.
:: ------ Ende der SkizzeCallAllCMDsInDir.bat --- ** UNGETESTET --- **
HTH
Frank / der Biber aus Bremen
Bitte warten ..
Mitglied: 16640
01.09.2005 um 08:52 Uhr
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.
Bitte warten ..
Mitglied: Biber
01.09.2005 um 09:07 Uhr
@16640
uuups..*geschockt bin*

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

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
Bitte warten ..
Mitglied: Biber
01.09.2005 um 17:06 Uhr
@turbohawk
Funktioniert es, soll ich noch was erläutern oder bist Du noch ohnmächtig?
Bitte warten ..
Mitglied: 16640
01.09.2005 um 17:09 Uhr
dann schau Dir mal beispielsweise den SET-Befehl an
Bitte warten ..
Mitglied: Biber
01.09.2005 um 17:29 Uhr
@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
Bitte warten ..
Mitglied: turbohawk
01.09.2005 um 23:38 Uhr
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 ???
Bitte warten ..
Mitglied: Biber
02.09.2005 um 09:27 Uhr
Moin Turbohawk,

sollte ja auch nur eine Skizze sein... Also:
01.
@echo off  
02.
setlocal  
03.
<b>Set "Workdir=e:\oracle\logmnr\new" 
04.
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old" 
05.
pushd %Workdir% </b> 
06.
FOR /F %%a IN ('dir /b %WorkDir%<b>\*.cmd</b>') DO call :loop %%a  
07.
<b>popd 
08.
goto end</b> 
09.
 
10.
:loop  
11.
Call %~f1  
12.
::pause  
13.
if Errorlevel 1 (  
14.
echo %~f1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.  
15.
goto :eof  
16.
) ELSE (  
17.
Echo (Debug) Alles ok, %~f1 wird verschoben... 
18.
COPY /y %~f1 %BatchesSaveDir% >nul  
19.
del /y %~f1 >nul  
20.
)  
21.
goto :eof  
22.
 
23.
<b>------die Zeile sollte raus!! :eof </b> 
24.
:end 
25.
echo das war alles  
26.
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
Bitte warten ..
Mitglied: turbohawk
03.09.2005 um 01:28 Uhr
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
Bitte warten ..
Mitglied: Biber
03.09.2005 um 03:47 Uhr
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:
01.
@echo off 
02.
REM goto machsRichtig  
03.
md 2>nul 
04.
echo Errorlevel bei md ohne Parameter ist: %errorlevel% 
05.
if Errorlevel 1  
06.
(  
07.
echo bin im Zweig Fehlerfall!!  
08.
)  
09.
ELSE  
10.
(  
11.
Echo bin im Zweig kein Fehler.. 
12.
pause  
13.
)  
14.
 
15.
:machsrichtig 
16.
md 2>nul 
17.
echo Errorlevel bei md ohne Parameter ist: %errorlevel% 
18.
if Errorlevel 1 (  
19.
echo bin im Zweig Fehlerfall!!  
20.
 
21.
) ELSE (  
22.
 
23.
Echo bin im Zweig kein Fehler.. 
24.
pause  
25.
)
...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
Bitte warten ..
Mitglied: turbohawk
03.09.2005 um 04:07 Uhr
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
Bitte warten ..
Mitglied: Biber
03.09.2005 um 05:11 Uhr
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...
Bitte warten ..
Mitglied: turbohawk
03.09.2005 um 05:37 Uhr
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
Bitte warten ..
Mitglied: Biber
03.09.2005 um 23:45 Uhr
Sorry, Turbohawk,
war mein Fehler. Zuviel Becks, zu wenig Schlaf.
Habe folgenden TurboTest.bat laufen lassen (Ausgabe und Doku ist gleich mit drin)
01.
@echo off  
02.
setlocal  
03.
Set "Workdir=e:\oracle\logmnr\new"  
04.
Set "BatchesSaveDir=e:\commandfiles\commandfiles-old"  
05.
Set "Workdir=d:\temp2"       & REM Diese Zeile kannst du wegwerfen 
06.
Set "BatchesSaveDir=d:\temp" & REM Diese Zeile kannst du wegwerfen 
07.
(Echo ...##Debug## dir /b %Workdir%\*.cmd:)    & REM Diese Zeile kannst du wegwerfen 
08.
dir /b %Workdir%\*.cmd          & REM Diese Zeile kannst du wegwerfen 
09.
pushd %Workdir%  
10.
FOR /F %%a IN ('dir /b %WorkDir%\*.cmd') DO call :loop %%a  
11.
popd  
12.
goto :eof  
13.
-----------------------Ende Hauptprogramm 
14.
:loop  
15.
Call %1  
16.
::pause  
17.
if Errorlevel 1 (  
18.
echo %1 endete mit Fehler!! Wird nicht verschoben und nochmal versucht.  
19.
goto :eof  
20.
) ELSE (  
21.
Echo ........##Debug## Alles ok, %1 wird verschoben...  
22.
ECHO COPY /y %1 %BatchesSaveDir% rem  
23.
rem >nul  
24.
ECHO del %1  
25.
rem >nul  
26.
)  
27.
goto :eof  
28.
-------------------------- 
29.
Inhalt von CalledCmd1.Cmd (und CalledCmd2 und CalledCmd3) sind 2 Zeilen: 
30.
@echo off & echo hier beginnt %0 
31.
For /L %%i in (1, 1, 100000) do if %%i==100000 echo %0 ist fertig... 
32.
--------ende CalledCmds 
33.
 
34.
 
35.
Ausgabe von Turbotest.bat: 
36.
------------ 
37.
D:\temp> 
38.
>Turbotest.bat 
39.
...##Debug## dir /b d:\temp2\*.cmd: 
40.
CalledCmd1.cmd 
41.
CalledCmd2.cmd 
42.
CalledCmd3.cmd 
43.
hier beginnt CalledCmd1.cmd 
44.
CalledCmd1.cmd ist fertig... 
45.
........##Debug## Alles ok, CalledCmd1.cmd wird verschoben... 
46.
COPY /y CalledCmd1.cmd d:\temp rem 
47.
del CalledCmd1.cmd 
48.
hier beginnt CalledCmd2.cmd 
49.
CalledCmd2.cmd ist fertig... 
50.
........##Debug## Alles ok, CalledCmd2.cmd wird verschoben... 
51.
COPY /y CalledCmd2.cmd d:\temp rem 
52.
del CalledCmd2.cmd 
53.
hier beginnt CalledCmd3.cmd 
54.
CalledCmd3.cmd ist fertig... 
55.
........##Debug## Alles ok, CalledCmd3.cmd wird verschoben... 
56.
COPY /y CalledCmd3.cmd d:\temp rem 
57.
del CalledCmd3.cmd 
58.
 
59.
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
Bitte warten ..
Mitglied: turbohawk
05.09.2005 um 07:00 Uhr
Danke !!! Bieber Du bist mein Retter & held hat alles sehr gut geklappt.
Mehr Leute wie Dich muss das Forum haben.

Gruss
turbohawk
Bitte warten ..
Mitglied: Biber
05.09.2005 um 09:32 Uhr
@Turbi
*rotwerd*
Danke für das Kompliment - und: das Forum hat eine Menge solcher Leute.

Frank / der (Rot-)Biber aus Bremen
Bitte warten ..
Mitglied: OneAdmin
26.04.2006 um 18:48 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Linux Tools
CURL mehrere Dateien vom ftp-Server herunterladen (10)

Frage von highpriest zum Thema Linux Tools ...

Windows 7
gelöst Mehrere Dateien in Windows umbenennen mit Batchjob (4)

Frage von Jeduja zum Thema Windows 7 ...

Microsoft Office
Excel VBA "SVERWEIS" über mehrere Dateien in Ordner (2)

Frage von Acht85 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (29)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...