Ausführen mehrerer Befehle über ein Windows-Cmd-Skript


136

Ich versuche, ein Windows-Cmd-Skript zu schreiben, um mehrere Aufgaben in Reihe auszuführen. Es stoppt jedoch immer nach dem ersten Befehl im Skript.

Der Befehl, nach dem es stoppt, ist ein Maven-Build (nicht sicher, ob dies relevant ist).

Wie mache ich es bitte weiter und führe jede Aufgabe der Reihe nach aus?

Das Installieren von Software oder das Konfigurieren der Registrierung usw. kommt überhaupt nicht in Frage - es muss leider bei einer Vanilla Windows XP-Installation funktionieren.

Idealerweise möchte ich, dass das Skript abgebrochen wird, wenn einer der Befehle fehlschlägt, aber das ist ein "nice to have", nicht unbedingt erforderlich.

Vielen Dank.

Antworten:


139

Wenn Sie eine andere .bat-Datei aufrufen, müssen Sie vor dem Aufruf "anrufen":

call otherCommand.bat

1
Hallo, im ursprünglichen Skript habe ich keine anderen .cmd-Dateien aufgerufen, aber seitdem habe ich sie in separate Dateien aufgeteilt, damit ich sie nacheinander ausführen kann. Es scheint also den Trick getan zu haben, vor jedem Befehl einen Anruf zu tätigen, danke!
Darren Greaves

5
Tatsächlich ist Windows unter Windows mvneine .bat-Datei für sich, daher müssen Sie callsie wie in verwenden call mvn install. Normalerweise müssen Sie keine zusätzliche Cmd-Datei erstellen.
jfpoilpret

2
Beachten Sie, dass Sie in Batchdateien keine Semikolons benötigen. Der Grund, warum Sie call verwenden müssen, ist, dass mvn selbst eine Batch-Datei ist und Batch-Dateien sich gegenseitig beim Aufruf aufrufen müssen, andernfalls kehrt die Steuerung nicht zum Anrufer zurück.
Pushkar

@ Gulzar Nazim - Wissen Sie, ob ich alle Befehle mit einer if-else-Anweisung in eine einzelne Batchdatei einfügen kann, da ich sie nicht in verschiedenen Batchdateien verwalten möchte?
Ng2-Fun

1
Ich habe versucht, mit npmUpdates und protractorTests etwas Ähnliches zu tun . Ich glaube nicht , diese Antwort auf mich angewendet , bis ich realisiert npmund protractorsind .cmdDateien unter Windows.
Joshden

45

Sie können das Symbol && zwischen Befehlen verwenden, um den zweiten Befehl nur auszuführen, wenn der erste erfolgreich ist. Weitere Infos hier http://commandwindows.com/command1.htm


Danke, ich werde es in Verbindung mit der oben akzeptierten Antwort versuchen.
Darren Greaves

Stoppt dies die Ausführung des zweiten Skripts, wenn der Maven-Build fehlschlägt?
Varun Achar

Dieser Link ist unterbrochen: "Der Backend-Server hat nicht rechtzeitig geantwortet. Der App-Server ist zu ausgelastet und kann Anforderungen nicht rechtzeitig bearbeiten."
Kevinji

1
@TheM Windows unterscheidet zwischen GUI-basierten und befehlsbasierten Anwendungen (am Anfang der EXE-Datei befindet sich ein Flag). Wenn Sie eine GUI-basierte Anwendung über die Befehlszeile starten, scheint sie immer sofort zu enden, da sie vollständig von der Befehlszeile getrennt ist. Wenn Sie ein befehlsbasiertes Programm über ein GUI-Programm (wie Explorer) starten, wird immer eine neue Befehlszeile angezeigt. POSIX-Systeme machen keine solche Unterscheidung, daher ist das Verhalten konsistenter.
Coderforlife

2
@ TheM Um dies zu umgehen, können Sie verwendenstart /B /WAIT calc
coderforlife

25

Ich bin mir nicht sicher, warum der erste Befehl gestoppt wird. Wenn Sie es parallel machen können, können Sie so etwas versuchen

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat

7
Verwenden Sie /Kanstelle von, /Cwenn die Shell nach Ausführung Ihres Befehls geöffnet bleiben soll.
JellicleCat

Keine Notwendigkeit zu verwenden cmd.exeund startwird einfach start x.bat1tun.
user66001

23

Ich habe gerade genau die gleiche (ish) Aufgabe ausgeführt, ein Batch-Skript zum Ausführen von Maven-Testskripten zu erstellen. Das Problem ist, dass das Aufrufen von Maven-Skripten mit mvn clean install ... selbst ein Skript ist und daher mit dem Aufruf von mvn clean install durchgeführt werden muss.

Code, der funktionieren wird

rem run a maven clean install
cd C:\rbe-ui-test-suite 
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1

Beachten Sie eher die Verwendung von Anruf. Dies ermöglicht die Verwendung aufeinanderfolgender Maven-Skripte in der Batch-Datei.


5

Bei Verwendung von doppeltem kaufmännischem Und wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich ist:

cd Desktop/project-directory && atom .

Wobei as mit nur einem kaufmännischen Und versucht, beide Befehle auszuführen, auch wenn der erste fehlschlägt:

cd Desktop/project-directory & atom .

1

Wenn Sie unter Windows ausgeführt werden, können Sie den folgenden Befehl verwenden.

Fahrt:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit

1

Ich kenne die direkte Antwort auf Ihre Frage nicht, aber wenn Sie viele dieser Skripte erstellen, lohnt es sich möglicherweise, eine leistungsfähigere Sprache wie Perl zu lernen. Für Windows gibt es kostenlose Implementierungen (z. B. Activestate, Cygwin). Ich habe festgestellt, dass sich die anfängliche Anstrengung für meine eigenen Aufgaben lohnt.

Bearbeiten:

Wenn Sie keine zusätzliche Software installieren können, sollten Sie, wie von @Ferruccio vorgeschlagen, vbscript und / oder javascript in Betracht ziehen. Sie sind in den Windows-Skripthost integriert.


Vielen Dank, aber ich kann keine Software installieren. Ich wünschte, ich hätte Zugriff auf etwas Mächtigeres als die beschissene Windows-Skriptsprache. :-(
Darren Greaves

6
Sie können immer vbscript oder javascript verwenden. Sie sind in den Windows-Skripthost integriert.
Ferruccio

0

Beachten Sie, dass Sie in Batchdateien keine Semikolons benötigen. Der Grund, warum Sie call verwenden müssen, ist, dass mvn selbst eine Batch-Datei ist und Batch-Dateien sich gegenseitig beim Aufruf aufrufen müssen, andernfalls kehrt die Steuerung nicht zum Anrufer zurück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.