Die Batchdatei wird nach dem ersten Befehl nicht mehr ausgeführt

75

Ich verwende das Tool 'HTML Match', um zwei HTML-Dateien zu vergleichen. Da ich viele Dateien vergleichen muss, erstelle ich eine Batchdatei wie die folgende. Zum Beispiel gebe ich nur fünf Sätze von Dateien.

cd "C:\Program Files\HTML Match"
HTMLMATCH.EXE "D:\Raj\compare1\a1.html" "D:\Raj\compare2\a1.html" "D:\Raj\compare_res\a1.html"
HTMLMATCH.EXE "D:\Raj\compare1\a2.html" "D:\Raj\compare2\a2.html" "D:\Raj\compare_res\a2.html"
HTMLMATCH.EXE "D:\Raj\compare1\a3.html" "D:\Raj\compare2\a3.html" "D:\Raj\compare_res\a3.html"
HTMLMATCH.EXE "D:\Raj\compare1\a4.html" "D:\Raj\compare2\a4.html" "D:\Raj\compare_res\a4.html"
HTMLMATCH.EXE "D:\Raj\compare1\a5.html" "D:\Raj\compare2\a5.html" "D:\Raj\compare_res\a5.html"

Wenn ich diese Batchdatei in einer cmd-Eingabeaufforderung ausführe, wird nur die erste Zeile, dh nur 'a1.html', verglichen und es wird ein Ergebnis erzeugt. Dann stoppt die Ausführung.

Rajashekar
quelle

Antworten:

125

Fügen Sie callvor den von Ihnen ausgeführten Befehlen hinzu.

Sie können dies auch in eine for-Schleife ändern, also:

FOR /L %%i in (1,1,5) DO CALL HTMLMATCH.EXE D:\Raj\compare%%i%%\a%%i%%.html D:\Raj\compare%%i%%\a%%i%%.html D:\Raj\compare_res\a%%i%%.html
Ben
quelle
Meinst du "Anruf" vor jeder Zeile, die ich gegeben habe, oder rufst du einfach xyz.bat an?
Rajashekar
1
Ich meine callvor jeder Zeile, die Sie geschrieben haben (abgesehen von wahrscheinlich der cd).
Ben
Der Name der Datei kann sich von diesem Format in einen anderen Namen ändern.
Gibt
Ja, die for-Schleife erledigt das. Ändern Sie, was Sie brauchen. Geben Sie help forin einem cmd - Fenster , um herauszufinden , was Sie brauchen. Hat das Hinzufügen callgeholfen?
Ben
57

Die Antwort auf Ihr Problem ist zu schreiben CALL HTMLMATCH.EXE (und der Rest der Parameter). Verwenden Sie einfach CALLvor jedem ausführbaren Befehl in der Batch-Datei.

BJoe
quelle
33
Ich habe heute meine erste Batch-Datei seit ungefähr 5 Jahren geschrieben und bin auf dasselbe Problem gestoßen. Falls sich jemand wundert, liegt der Grund für das Hinzufügen von "Aufruf" darin, dass durch das direkte Aufrufen einer zweiten Batchdatei aus der ersten die zweite Batchdatei die erste im Interpreter ersetzt. Wenn die zweite Batchdatei beendet wird, hat der Interpreter die ursprüngliche Batchdatei, die Sie aufgerufen haben, vollständig vergessen. Der Aufrufbefehl veranlasst den Interpreter, zu verfolgen, wo die aufrufende Batch-Datei aufgehört hat, und dorthin zurückzukehren, wenn die aufgerufene Batch-Datei beendet wird.
Mark Bessey
1
@MarkBessey: Ja, Sie haben absolut Recht, wenn Sie eine zweite Batch-Datei aus der ersten heraus aufrufen , aber das ist hier nicht der Fall, da das aufgerufene Programm eine .EXE ist und das NICHT benötigt CALL!
Aacini
Dies ist wahr, aber ich denke, es lohnt sich, Lösungen für verwandte Probleme zu finden, da dies das Ergebnis ist, das sich ergibt, wenn hier nach dem häufigeren Problem gesucht wird. Ich kann mir auch keinen anderen Weg vorstellen, wie das beschriebene Verhalten passieren würde, also frage ich mich, ob der Beschreibung einige Details fehlen.
Mark Bessey
1
@Aacini Es scheint, dass bestimmte ausführbare Dateien mit einem seltsamen Exit-Code beendet werden, der verhindert, dass der Rest einer Batchdatei ausgeführt wird. In diesem Fall funktioniert die Problemumgehung, CALL zum Ausführen in einer anderen Batchdatei zu verwenden.
Mahn
1

Ich habe nach etwas wirklich Ähnlichem gesucht und versucht, alle Antworten hier zu hinterlassen, aber ich habe endlich die Lösung für mein Problem gefunden !!

In meinem Skript möchte ich überprüfen, ob ein Prozess ausgeführt wird. Wenn nicht, starten Sie ihn (eine EXE-Datei) und prüfen Sie dann, ob ein anderer Prozess ausgeführt wird. Wenn nicht, starten Sie ihn ebenfalls (lassen Sie jedoch alle Programme geöffnet). Das Problem besteht darin dass die erste .exe gestartet wurde, dann aber nicht zur zweiten verschoben wurde, weil sie bis zum Ende des Prozesses wartete. Es funktioniert endlich für mich mit Start und die Magie kommt mit ...

/trennen

es funktioniert für mich als:

start "program1" /separate program1.exe
other commands

Bevor es nach dem Start von program1 aufhörte, weil es darauf wartete, dass es geschlossen wurde, glaube ich, aber das würde nicht passieren, weil ich es offen lassen wollte. Jetzt mit dem Start / Separate geht es weiter mit den anderen Befehlen.

Ich habe es in einem anderen Forum gefunden, aber die Sache ist, dass es das Handbuch ist, / separate wird verwendet, um in einem anderen Speicherbereich zu starten.

im Test durchgefallen
quelle
-1

Sie müssen keine Anführungszeichen einfügen, zwischen denen kein Leerzeichen steht.

Versuch das:

HTMLMATCH.EXE D:\Raj\compare1\a1.html D:\Raj\compare2\a1.html D:\Raj\compare_res\a1.html

Vielleicht löst es Ihr Problem.

Adrian K.
quelle