Frage Wie wartest du darauf, dass eine exe in einer Batch-Datei abgeschlossen wird?


Ich versuche, ein Skript zu erstellen, um eine Exe beim Herunterfahren auszuführen, um sp1 zu installieren. Mein Skript geht so etwas wie (nicht wirklich Bat-Skript).

If installed GOTO END
    Install.exe
END:

Mein Problem ist, dass es beim Starten das Installationsprogramm startet und dann das Skript beendet, weil der Installer einen anderen Prozess hat und den Installationsprozess herunterfährt, weil der Computer das System herunterfährt und herunterfährt (zumindest denke ich das.) es tut.)

Gibt es eine Möglichkeit zu sagen, dass es warten soll, bis der Prozess, zu dem es gestartet wurde, abgeschlossen ist und dann heruntergefahren wird?


39
2018-03-09 20:46


Ursprung




Antworten:


Versuche zu laufen

START /WAIT Install.exe

72
2018-03-09 20:54



Tolle Arbeit mit dieser Antwort! - l--''''''---------''''''''''''
Kannst du Kette? like start /wait install; exit? - Serj Sagan
das kannst du immer tun cmd /C start /wait install - graywolf
Was, wenn Sie auf einen Prozess warten müssen, dass die Batch-Datei nicht gestartet wurde? - Kyle Delaney


Ein kürzerer Weg:

Install.exe|more

Ebenfalls

install|rem

könnte verwendet werden, obwohl mit mehr schließlich Sie etwas Konsolenausgabe fangen können. Und das ist der Grund, warum es funktioniert - der Piped-Befehl wartet auf die Eingabe, bis die .exe beendet ist


20
2017-10-22 12:34



und warum ist das Downlvote? - npocmaka
Das ist ausgezeichnet! Ich stimme dir zu. - Changwang Zhang
Das gewinnt eindeutig - Fnord


Entweder direkt aus der Batch-Datei aufrufen oder verwenden start /wait wird funktionieren, aber es gibt einen Vorbehalt.

Wenn die exe, die Sie aufrufen, einen anderen Prozess erstellt, z. B. eine andere exe aufruft, und die Batch-Datei beendet, 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 eines komprimierten Containers extrahieren, der in die Exe selbst eingebettet werden kann, um dann eine der extrahierten Dateien auszulösen und zu beenden. Einige Installationsprogramme stellen Befehlszeilenparameter bereit, mit denen die ursprüngliche EXE nicht beendet wird, bis die gesamte Installation abgeschlossen ist. Dies sollten Sie untersuchen. Ansonsten gibt es keinen wirklichen Weg, dies allein mit Batch-Dateien zu tun und würde eine programmatische Lösung zur Lösung bringen.


10
2018-03-09 21:25



Sie können der Shutdown-Routine immer eine Schleife hinzufügen, um zu überprüfen, ob msiexec.exe (oder was auch immer die Hölle ist) ausgeführt wird und dann wartet und wiederholt. - mfinni
@mfinni, nur um die Dinge noch weiter zu komplizieren, msiexec feuert oft auch andere Prozesse ab. :( - John Gardeniers
Eigentlich, warum brauchst du? start /wait überhaupt? Ich selbst glaubte, dass es gebraucht wird start /wait um die Batch-Datei zu blockieren, bis die GUI-Anwendung (im Gegensatz zu einer Konsole) beendet wird. Aber wenn ich es jetzt teste, sehe ich, dass Batch-Dateien sogar auf GUI-Anwendungen warten. Ich habe entsprechende Frage gepostet: Warum blockiert eine GUI-Anwendung eine Batch-Datei? - Martin Prikryl
Ich hatte dieses Problem, fügte meine Lösung als Antwort hinzu. - FreeSoftwareServers


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

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

3
2018-06-19 12:46



Angenommen, Matlab erscheint mir etwas seltsam, besonders hier auf Serverfault. - Erik
Dies kann für andere Dinge als MATLAB funktionieren. Ändern Sie einfach "MATLAB.exe" zu etwas anderem. Und vielleicht beheben Sie diese zweite 'Suche', um erneut nach der exe in der gefilterten Ausgabe zu suchen. - Oliver Bock


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

Oder wenn Sie wissen, wie lange die Ausführung dauert, können Sie sich den Schlafbefehl ansehen, der vom Windows Server 2003 Resource Kit-Tools . Sleep.exe kann verwendet werden, um den Stapel für eine beliebige Anzahl von Sekunden anzuhalten, damit das Programm vollständig installiert werden kann, bevor die Stapelverarbeitungsdatei mit der Installation 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.


0
2018-03-09 21:03





Ich hatte das Problem @John Gardeniers Had oder beschrieben, wo meine exe eine andere exe anrief und beendete, dafür startete / warte nicht. Ich habe eine "while-Schleife" erstellt, um zu prüfen, ob sie läuft und dann weiter geht, 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
2018-03-15 02:21