it-swarm.com.de

So führen Sie mehrere .BAT-Dateien in einer .BAT-Datei aus

Ich versuche, meinen commit-build.bat zu veranlassen, andere .BAT-Dateien als Teil unseres Erstellungsprozesses auszuführen.

Inhalt von commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

Dies scheint einfach zu sein, aber commit-build.bat führt nur das erste Element in der Liste aus (msbuild.bat).

Ich habe jede der Dateien ohne Probleme separat ausgeführt.

635
Th3Fix3r

Verwenden:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Wenn Sie CALL nicht verwenden, wird die aktuelle Batchdatei angehalten und die Ausführung der aufgerufenen Batchdatei gestartet. Es ist ein eigenartiges Verhalten, das bis in die frühen MS-DOS-Tage zurückreicht.

1083

Alle anderen Antworten sind richtig: benutze call. Zum Beispiel:

 call "msbuild.bat"

Geschichte

In alten DOS-Versionen war es nicht möglich, Batch-Dateien rekursiv auszuführen. Dann wurde der Aufrufbefehl eingeführt, der eine andere Cmd-Shell aufrief, um die Batch-Datei auszuführen, und die Ausführung an die aufrufende Cmd-Shell zurückgab, wenn sie fertig war.

Offensichtlich war in späteren Versionen keine weitere cmd-Shell mehr erforderlich.

Früher hingen viele Batch-Dateien davon ab, dass der Aufruf einer Batch-Datei nicht zur aufrufenden Batch-Datei zurückkehrte. Das Ändern dieses Verhaltens ohne zusätzliche Syntax hätte viele Systeme wie Batch-Menüsysteme beschädigt (Verwendung von Batch-Dateien für Menüstrukturen).

Wie in vielen Fällen bei Microsoft ist daher die Abwärtskompatibilität der Grund für dieses Verhalten.

Tipps

Wenn Ihre Stapeldateien Leerzeichen enthalten, setzen Sie den Namen in Anführungszeichen:

call "unit tests.bat"

Übrigens: Wenn Sie nicht alle Namen der Batch-Dateien haben, können Sie dies auch tun (dies garantiert nicht die richtige Reihenfolge der Batch-Dateiaufrufe; es folgt der Reihenfolge des Dateisystems):

FOR %x IN (*.bat) DO call "%x"

Sie können auch nach einem Anruf auf Fehler reagieren. Verwenden:

exit /B 1   # Or any other integer value in 0..255

einen Fehlerlevel zurückgeben. 0 bedeutet korrekte Ausführung. In der aufrufenden Batch-Datei können Sie mit reagieren

if errorlevel neq 0 <batch command>

Verwenden Sie if errorlevel 1, wenn Sie ein älteres Windows als NT4/2000/XP haben, um alle Fehlerebenen 1 und höher abzufangen.

Um den Fluss einer Batch-Datei zu steuern, gibt es goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Wie andere betonten: Sehen Sie sich Build-Systeme an, um Batch-Dateien zu ersetzen.

168

Wenn wir mehrere Eingabeaufforderungen öffnen möchten, könnten wir verwenden

start cmd /k

/k: ist obligatorisch und wird ausgeführt.

Das Starten vieler Eingabeaufforderungen kann wie folgt erfolgen.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.
106
farheen

Versuchen:

call msbuild.bat
call unit-tests.bat
call deploy.bat
41
Jonathan

Sie rufen mehrere Stapel auf, um ein Programm zu kompilieren. Ich nehme an, dass wenn ein Fehler auftritt:
1) Das Programm innerhalb des Stapels wird mit einer Fehlerstufe beendet.
2) Sie möchten es wissen.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' testet auf eine Fehlerstufe über 0. Auf diese Weise werden alle Stapel der Reihe nach aufgerufen, werden jedoch bei jedem Fehler gestoppt, und der Bildschirm bleibt so, wie Sie eine Fehlermeldung sehen können.

27
Jay
call msbuild.bat
call unit-tests.bat
call deploy.bat
21
butterchicken

Um eine .bat -Datei innerhalb einer .bat -Datei aufzurufen, verwenden Sie

call foo.bat

(Ja, das ist albern, es wäre sinnvoller, wenn Sie es mit foo.bat aufrufen könnten, wie Sie es von der Eingabeaufforderung aus tun könnten, aber der richtige Weg ist, call zu verwenden.)

19
Zifre

Wenn wir zwei Batch-Skripte haben, aaa.bat und bbb.bat, und wie folgt aufrufen

call aaa.bat
call bbb.bat

Beim Ausführen des Skripts wird zuerst aaa.bat aufgerufen, auf das Beenden des Threads von aaa.bat gewartet und bbb.bat aufgerufen.

Wenn Sie jedoch nicht warten möchten, bis aaa.bat beendet ist, um bbb.bat aufzurufen, versuchen Sie, den Befehl START zu verwenden:

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

Prüfung:

start /b aaa.bat
start /b bbb.bat
18
user2314621

Wenn Sie sich Ihre Dateinamen ansehen, haben Sie überlegt, ein Build-Tool wie NAnt oder Ant (die Java-Version) zu verwenden. Sie erhalten viel mehr Kontrolle als mit Fledermaus-Dateien.

7
Dave Archer
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

Wenn das nicht funktioniert, ersetzen Sie start durch call oder versuchen Sie Folgendes:

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
6
McOussKing

Wenn Sie mehrere Batch-Dateien gleichzeitig öffnen möchten, können Sie den Befehl call verwenden. Der Aufrufbefehl schließt jedoch die aktuelle Fledermausdatei und wechselt zu einer anderen. Wenn Sie viele auf einmal öffnen möchten, können Sie Folgendes versuchen:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

Und so weiter oder starten Sie cmd "call..." für so viele Dateien. Dies funktioniert für Windows 7, bei anderen Systemen bin ich mir jedoch nicht sicher.

5
CMS_95

Beim Ausführen mehrerer Skripte in einem hatte ich das gleiche Problem. Ich ließ es beim ersten Mal sterben, ohne zu bemerken, dass es beim ersten Drehbuch beendet wurde.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

Ich habe alle 11 EXIT-Zeilen meines Skripts entfernt und es erneut versucht. Alle 11 wurden nacheinander im selben Befehlsfenster ausgeführt.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar
2
John Oliphant

Verwenden Sie einfach den Befehl call! Hier ist ein Beispiel:

call msbuild.bat
call unit-tests.bat
call deploy.bat
2
PryroTech

Mit korrektem Zitat (das kann manchmal schwierig sein):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

1. Argument - Titel (in diesem Fall leer)
2. Argument -/D gibt das Startverzeichnis an, kann weggelassen werden, wenn das aktuelle Arbeitsverzeichnis angezeigt werden soll (z. B. "% ~ dp0")
3rd arg - Befehl zum Starten, "cmd.exe"
4th arg - Argumente zu befehlen, mit doppelten Anführungszeichen für die darin enthaltenen Argumente (dies ist, wie Sie Anführungszeichen innerhalb von Anführungszeichen in Batch)

2
robertcollier4

Hier ist mein Weg =

cmd /c ""Path_Bat_Here.bat" %ARG%"
:: Or =
Call *.bat

Hilfe = cmd /?

0
scientist_7