Wie warten Sie, bis eine Exe in der Batch-Datei abgeschlossen ist?


43

Ich versuche, ein Skript zu erstellen, um beim Herunterfahren eine exe auszuführen, um sp1 zu installieren. mein script geht so ähnlich (nicht aktuelles bat script).

If installed GOTO END
    Install.exe
END:

Mein Problem ist, dass, wenn es ausgeführt wird, es das Installationsprogramm startet, dann das Skript beendet, weil das Installationsprogramm einen anderen Prozess ausführt, und anschließend den Installationsprozess herunterfährt, weil der Computer herunterfährt und das System herunterfährt (zumindest denke ich, dass dies so ist es tut.)

Gibt es eine Möglichkeit, es anzuweisen, zu warten, bis der Prozess, den es gestartet hat, abgeschlossen und dann heruntergefahren ist?

Antworten:



23

Ein kürzerer Weg:

Install.exe|more

Ebenfalls

install|rem

könnte verwendet werden, aber mit der Zeit werden Sie in der Lage sein, einige Konsolenausgaben abzufangen. Und das ist der Grund, warum es funktioniert - der Pipe-Befehl wartet auf Eingaben, bis die EXE-Datei fertig ist


und warum ist das downlvote?
Npocmaka

Das ist ausgezeichnet! Ich stimme dir zu.
Changwang Zhang

2
dies gewinnt eindeutig
Fnord

was ist, wenn die exe parameter annimmt? wie würde das gehen
m4l490n

@ m4l490n - es wird gut funktionieren. Die Umleitung und bedingte Ausführung Betreiber haben die höhere Priorität in den Batch - Skripten ( <, >, >>, &, &&, ||, |)
npocmaka

13

Entweder ruft man die Exe direkt aus der Batch-Datei auf oder verwendet start /waitsie, aber es gibt eine Einschränkung.

Wenn die aufgerufene Exe einen anderen Prozess erstellt, z. B. das Aufrufen einer anderen Exe, und die Batchdatei dann beendet wird, wird die Verarbeitung fortgesetzt, nachdem die aufgerufene Exe beendet wurde, da sie keine Kenntnis von anderen von ihr gestarteten Prozessen hat.

In Ihrem Fall ist dies ein echtes Problem, da Installationsprogramme normalerweise Dateien aus einer Form von komprimierten Containern extrahieren, die möglicherweise in der EXE-Datei selbst eingebettet sind, dann eine der extrahierten Dateien abfeuern und beenden. Einige Installationsprogramme stellen Befehlszeilenparameter zur Verfügung, mit denen die ursprüngliche Exe angewiesen wird, erst zu beenden, wenn die gesamte Installation abgeschlossen ist. Davon abgesehen gibt es keinen wirklichen Weg, dies mit Batch-Dateien alleine zu umgehen, und es wäre eine programmatische Lösung erforderlich, um dies zu lösen.


Sie können der Shutdown-Routine jederzeit eine Schleife hinzufügen, um zu überprüfen, ob msiexec.exe (oder was auch immer zum Teufel ist) ausgeführt wird, und dann warten und die Schleife wiederholen.
mfinni

@mfinni löst msiexecoft auch andere Prozesse aus , nur um die Sache noch komplizierter zu machen . :(
John Gardeniers

1
Warum brauchst du eigentlich start /waitüberhaupt? Ich selbst war der Meinung, dass es notwendig ist, start /waitBatch-Dateien zu blockieren, bis die GUI-Anwendung (im Gegensatz zu einer Konsole) beendet ist. Wenn ich es jetzt teste, sehe ich, dass Batch-Dateien sogar auf GUI-Anwendungen warten. Ich habe die entsprechende Frage gestellt: Warum blockiert die GUI-Anwendung eine Batch-Datei?
Martin Prikryl

Ich hatte dieses Problem, fügte meine Lösung als Antwort hinzu.
FreeSoftwareServers

5

Hier ist ein Beispiel mit MATLAB! Ich bin davon ausgegangen, dass die Pfadeinrichtung für MATLAB abgeschlossen ist und der MATLAB-Exit durch die Datei FileName.m sichergestellt wird (oder der Benutzer dies intern angegeben hat).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit

2
Angenommen, Matlab scheint mir ein bisschen seltsam zu sein, besonders hier bei Serverfehlern.
Erik

Dies kann für andere Dinge als MATLAB funktionieren. Ändern Sie einfach "MATLAB.exe" in etwas anderes. Und vielleicht den zweiten "Fund" korrigieren, um in der gefilterten Ausgabe erneut nach der Exe zu suchen.
Oliver Bock

1

Ich hatte das problem bei john gardeniers gehabt oder beschrieben, wo meine exe eine andere exe gerufen und gekündigt hat, dafür start / wait hat nicht funktioniert. Ich habe eine "while-Schleife" erstellt, um zu überprüfen, ob sie ausgeführt wird, und um dann fortzufahren, sobald sie fertig ist. Die Zeiten können an Ihre Bedürfnisse angepasst werden.

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

0

Sie können den Befehl start / wait verwenden. Dies startet eine Anwendung und wartet darauf, dass sie beendet wird.

Wenn Sie wissen, wie lange die Ausführung dauert, können Sie sich den Befehl sleep ansehen, der von den Windows Server 2003 Resource Kit-Tools bereitgestellt wird . Sleep.exe kann verwendet werden, um den Batch für eine beliebige Anzahl von Sekunden anzuhalten, damit das Programm vollständig installiert werden kann, bevor die Batchdatei mit der Installation anderer Komponenten fortfährt. Es gibt einige Programme, die die "start / wait" -Syntax ignorieren, da das Programm selbst einen anderen Prozess startet. Dann ist die sleep.exe sehr nützlich.

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.