Ich versuche, meine commit-build.bat
.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, führt jedoch commit-build.bat
nur das erste Element in der Liste aus ( msbuild.bat
).
Ich habe jede der Dateien ohne Probleme einzeln ausgeführt.
batch-file
cmd
Yvette
quelle
quelle
Antworten:
Verwenden:
Wenn Sie CALL nicht verwenden, wird die aktuelle Batchdatei gestoppt und die aufgerufene Batchdatei wird ausgeführt. Es ist ein eigenartiges Verhalten, das bis in die frühen MS-DOS-Tage zurückreicht.
quelle
Alle anderen Antworten sind richtig: Anruf verwenden. Zum Beispiel:
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 Batchdatei auszuführen, und die Ausführung nach Abschluss an die aufrufende cmd-Shell zurückgab.
Offensichtlich war in späteren Versionen keine andere cmd-Shell mehr erforderlich.
In den frühen Tagen hingen viele Batchdateien davon ab, dass das Aufrufen einer Batchdatei nicht zur aufrufenden Batchdatei zurückkehren würde. Das Ändern dieses Verhaltens ohne zusätzliche Syntax hätte viele Systeme wie Batch-Menüsysteme (Verwendung von Batch-Dateien für Menüstrukturen) beschädigt.
Wie in vielen Fällen bei Microsoft ist daher die Abwärtskompatibilität der Grund für dieses Verhalten.
Tipps
Wenn Ihre Batchdateien Leerzeichen enthalten, verwenden Sie Anführungszeichen um den Namen:
Übrigens: Wenn Sie nicht alle Namen der Batch-Dateien haben, können Sie dies auch verwenden (dies garantiert nicht die korrekte Reihenfolge der Batch-Dateiaufrufe; es folgt der Reihenfolge des Dateisystems):
Sie können auch nach einem Anruf auf Fehlerebenen reagieren. Verwenden:
einen Fehlerlevel zurückgeben. 0 bedeutet korrekte Ausführung. In der aufrufenden Batch-Datei können Sie mit reagieren
Verwenden
if errorlevel 1
Sie diese Option, wenn Sie ein älteres Windows als NT4 / 2000 / XP haben, um alle Fehlerstufen 1 und höher abzufangen.Um den Fluss einer Batch-Datei zu steuern, gehen Sie zu :-(
Wie andere betonten: Schauen Sie sich Build-Systeme an, um Batch-Dateien zu ersetzen.
quelle
errorlevel
Befehlsbeispiel gab mir ein Problem unter Windows 10 (in der Cmd-Konsole). Ich habe den Befehl einfach so geändert, dass er istif errorlevel neq echo Houston We have a Problem!
. Mein Batch-Prozess hatte keine Probleme und wurde größtenteils normal abgeschlossen, aber bei jedem Schritt, bei dem ich diesen Befehl nach einer Aufrufanweisung verwendet habe, wurde "neq war zu diesem Zeitpunkt unerwartet" angezeigt. Da ich dachte, dass sie möglicherweise die ungleiche Syntax geändert haben, habe ich es versucht!=
und auch<>
immer wieder den gleichen Fehler "zu diesem Zeitpunkt nicht erwartet" für die neue Syntax erhalten. Was könnte ich falsch machen?Wenn wir mehrere Eingabeaufforderungen öffnen möchten, können wir verwenden
/k
: ist obligatorisch und wird ausgeführt.Das Starten vieler Befehlsansagen kann wie folgt erfolgen.
quelle
start "Window title" /wait cmd /k call something.bat
um Dinge in sequentieller Reihenfolge auszuführen.start "Window title" /wait cmd /c something.bat
, wocmd /c
das Fenster schließt, wenn es fertig ist)Versuchen:
quelle
Sie rufen mehrere Stapel auf, um ein Programm zu kompilieren. Ich
gehe davon aus, dass im Fehlerfall: 1) Das Programm innerhalb des Stapels mit einer Fehlerstufe beendet wird;
2) Sie möchten es wissen.
'||' testet auf eine Fehlerstufe höher als 0. Auf diese Weise werden alle Stapel der Reihe nach aufgerufen, werden jedoch bei jedem Fehler angehalten, sodass der Bildschirm so bleibt, wie Sie eine Fehlermeldung sehen.
quelle
Wenn wir zwei Batch-Skripte haben, aaa.bat und bbb.bat, und wie unten aufrufen
Wenn Sie das Skript ausführen, ruft es zuerst aaa.bat auf, wartet, bis der Thread von aaa.bat beendet ist, und ruft bbb.bat auf.
Wenn Sie jedoch nicht warten möchten, bis aaa.bat beendet wird, um bbb.bat aufzurufen, verwenden Sie den Befehl START :
Prüfung:
quelle
quelle
Verwenden Sie zum Aufrufen einer
.bat
Datei innerhalb einer.bat
Datei(Ja, das ist albern, es wäre sinnvoller, wenn Sie es mit aufrufen könnten
foo.bat
, wie Sie es an der Eingabeaufforderung tun könnten, aber der richtige Weg ist, es zu verwendencall
.)quelle
Haben Sie bei der Betrachtung Ihrer Dateinamen in Betracht gezogen, ein Build-Tool wie NAnt oder Ant (die Java-Version) zu verwenden ? Sie erhalten viel mehr Kontrolle als mit Fledermausdateien.
quelle
Wenn Sie viele Batchdateien gleichzeitig öffnen möchten, können Sie den Befehl call verwenden. Der Aufrufbefehl schließt jedoch die aktuelle Bat-Datei und wechselt zu einer anderen. Wenn Sie viele gleichzeitig öffnen möchten, können Sie Folgendes versuchen:
Und so weiter oder wiederholen Sie den Start
cmd
"call
..." für so viele Dateien. Dies funktioniert unter Windows 7 , bei anderen Systemen bin ich mir jedoch nicht sicher.quelle
Wenn das nicht funktioniert, ersetzen Sie es
start
durchcall
oder versuchen Sie Folgendes:quelle
Verwenden Sie einfach den
call
Befehl! Hier ist ein Beispiel:quelle
Bei korrekter Angabe (dies kann manchmal schwierig sein):
1. arg - Titel (in diesem Fall leer)
2. arg - / D gibt das Startverzeichnis an, kann weggelassen werden, wenn das aktuelle Arbeitsverzeichnis (z. B. "% ~ dp0")
3. arg - Befehl "cmd.exe"
4 gestartet werden soll arg - zu befehlende Argumente mit doppelten Anführungszeichen für die darin enthaltenen Argumente (so entziehen Sie Anführungszeichen in Anführungszeichen im Stapel)
quelle
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.
Ich entfernte alle 11 EXIT-Zeilen meiner Skripte und versuchte es erneut. Alle 11 wurden nacheinander im selben Befehlsfenster ausgeführt.
quelle
exit
s nicht,goto :eof
sondern ersetzen Sie sie stattdessen durch. Dies wird zumcall
@echo off :menu some commands goto menu
Beachten Sie, dass dies eine Endlosschleife ausführt, bis es geschlossen wird. Im Grunde brauchen Sie nicht die::
nur:
Folgendes löste mein Problem:
quelle
Vielleicht möchten Sie das:
Führen Sie die Batch-Skripte parallel aus.
Hier werden drei Batchdateien in minimierten Befehlsfenstern im minimierten Zustand ausgeführt. Wenn Sie nicht möchten, dass sie minimiert werden, entfernen Sie sie
/min
. Wenn Sie sie später nicht mehr steuern müssen, können Sie die Titel auch entfernen. Es wird also ein Bare-Bone-Befehl ausgeführtstart cmd /k call systemLogCollector.bat
Wenn Sie sie beenden möchten-
quelle