Jak czekasz na zakończenie exe w pliku wsadowym?

43

Próbuję utworzyć skrypt, aby wykonać exe przy zamykaniu w celu zainstalowania sp1. mój skrypt działa mniej więcej tak (nie rzeczywisty skrypt nietoperzy).

If installed GOTO END
    Install.exe
END:

Mój problem polega na tym, że po uruchomieniu uruchamia instalator, a następnie kończy skrypt, ponieważ instalator ma inny proces, a następnie zamyka proces instalacji, ponieważ komputer wyłącza się i system (przynajmniej tak myślę robi.)

Czy jest jakiś sposób, aby kazać mu czekać, aż proces, który rozpoczął, zostanie zakończony, a następnie zostać zamknięty?

Kravlin
źródło

Odpowiedzi:

81

Spróbuj uruchomić

START /WAIT Install.exe
Bart De Vos
źródło
świetna robota z tą odpowiedzią!
l - '' '' ----------- '' '' '' '17
Umiesz łańcuch? like start /wait install; exit?
Serj Sagan,
zawsze możesz to zrobićcmd /C start /wait install
graywolf
Co zrobić, jeśli musisz poczekać na proces, którego nie można uruchomić pliku wsadowego?
Kyle Delaney
23

Jedna krótsza droga:

Install.exe|more

Również

install|rem

może być użyty, chociaż z większą ilością ostatecznie będziesz w stanie złapać trochę danych wyjściowych konsoli. I to jest powód, dla którego działa - komenda potokowa czeka na dane wejściowe, aż do zakończenia pliku .exe

npocmaka
źródło
i dlaczego jest downlvote?
npocmaka
To jest wspaniałe! Głosuję za tobą.
Changwang Zhang
2
to wyraźnie wygrywa
Fnord,
co jeśli exe przyjmuje parametry? jak by to działało?
m4l490n
@ m4l490n - będzie działać dobrze. Operatorzy przekierowania i wykonanie warunkowego mają wyższy priorytet w skryptach wsadowych ( <, >, >>, &, &&, ||, |)
npocmaka
13

Wywołanie exe bezpośrednio z pliku wsadowego lub użycie start /waitbędzie działać, ale jest zastrzeżenie.

Jeśli wywoływany plik exe tworzy następnie inny proces, na przykład wywołuje inny plik exe, a następnie wychodzi, plik wsadowy będzie kontynuował przetwarzanie po zakończeniu wywoływanego pliku exe, ponieważ nie ma wiedzy o innych procesach przez niego uruchomionych.

W twoim przypadku jest to prawdziwy problem, ponieważ instalatory zwykle rozpakowują pliki z jakiejś formy skompresowanego kontenera, który może być osadzony w samym pliku exe, a następnie odpalają jeden z wyodrębnionych plików i wychodzą. Niektórzy instalatorzy zapewniają parametry wiersza polecenia, które mówią oryginalnemu exe, aby nie wychodził, dopóki cała instalacja nie zostanie zakończona, więc warto to sprawdzić. Poza tym nie ma realnego rozwiązania tego problemu z samymi plikami wsadowymi i wymagałoby rozwiązania programowego.

John Gardeniers
źródło
Zawsze możesz dodać pętlę do procedury zamykania, aby sprawdzić, czy msiexec.exe (lub cokolwiek to jest do cholery) działa, a następnie poczekać i zapętlić ponownie.
mfinni
@ mfinni, aby jeszcze bardziej skomplikować sprawy, msiexecczęsto odpala również inne procesy. :(
John Gardeniers,
1
Właściwie dlaczego w ogóle potrzebujesz start /wait? Sam uważałem, że trzeba go użyć start /waitdo zablokowania pliku wsadowego, dopóki GUI (w przeciwieństwie do konsoli) nie zakończy działania. Ale testując to teraz, widzę, że pliki wsadowe faktycznie czekają nawet na aplikacje GUI. Zadałem odpowiednie pytanie: Dlaczego aplikacja GUI blokuje plik wsadowy?
Martin Prikryl
Miałem ten problem, dodałem moje rozwiązanie jako odpowiedź.
FreeSoftwareServers
5

Oto przykład użycia MATLAB! Zakładam, że konfiguracja ścieżki dla MATLAB jest zakończona, a wyjście MATLAB jest zapewnione przez plik FileName.m (lub użytkownik określił to wewnętrznie).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit
Rachit Kumar
źródło
2
Zakładanie, że Matlab wydaje mi się trochę dziwny, szczególnie tutaj, jeśli chodzi o awarię serwera.
Erik
Może to działać dla rzeczy innych niż MATLAB. Wystarczy zmienić „MATLAB.exe” na coś innego. I może napraw to drugie „find”, aby ponownie wyszukać exe w filtrowanym wyjściu.
Oliver Bock,
1

Miałem problem @John Gardeniers Miałem lub opisałem, gdzie mój exe zadzwonił do innego exe i zakończył pracę, dlatego start / wait nie zadziałało. Utworzyłem „pętlę while”, aby sprawdzić, czy działa, a następnie po zakończeniu. Czasy można dostosować do własnych potrzeb.

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
FreeSoftwareServers
źródło
0

Możesz użyć polecenia start / wait. To uruchamia aplikację i czeka na jej zakończenie.

Lub jeśli wiesz, ile czasu zajmuje wykonanie, możesz rzucić okiem na komendę uśpienia, dostarczoną przez narzędzia Windows Server 2003 Resource Kit Tools . Sleep.exe może być użyty do wstrzymania wsadu na dowolną liczbę sekund, aby umożliwić programowi pełną instalację, zanim plik wsadowy przystąpi do zainstalowania czegokolwiek innego. Istnieje kilka programów, które ignorują składnię „start / wait”, ponieważ sam program uruchamia inny proces, wtedy program sleep.exe jest bardzo przydatny.

Guido van Brakel
źródło