Bagaimana Anda menunggu exe selesai dalam file batch?

43

Saya mencoba membuat skrip untuk mengeksekusi exe saat shutdown untuk menginstal sp1. skrip saya berjalan seperti (bukan skrip kelelawar yang sebenarnya).

If installed GOTO END
    Install.exe
END:

Masalah saya adalah ketika dijalankan, ia memulai penginstal, kemudian menyelesaikan skrip karena proses penginstal berbeda dan menindaklanjuti dengan mematikan proses penginstalan karena komputer mematikan dan mematikan sistem (setidaknya, itulah yang saya pikir sedang dilakukan.)

Apakah ada cara untuk mengatakannya untuk menunggu sampai proses mulai selesai dan kemudian dimatikan?

Kravlin
sumber

Jawaban:

81

Coba jalankan

START /WAIT Install.exe
Bart De Vos
sumber
kerja bagus dengan jawaban ini!
l --''''''--------- '' '' '' '' '' ''
Bisakah Anda rantai? like start /wait install; exit?
Serj Sagan
Anda selalu bisa melakukannyacmd /C start /wait install
graywolf
Bagaimana jika Anda perlu menunggu proses yang file batch tidak mulai?
Kyle Delaney
23

Satu cara yang lebih pendek:

Install.exe|more

Juga

install|rem

dapat digunakan, meskipun dengan lebih pada akhirnya Anda akan dapat menangkap beberapa output konsol. Dan inilah alasannya - perintah pipa menunggu input sampai .exe selesai

npocmaka
sumber
dan mengapa downlvote?
npocmaka
Ini luar biasa! Saya memilih Anda.
Changwang Zhang
2
ini jelas menang
Fnord
bagaimana jika exe mengambil parameter? bagaimana cara kerjanya?
m4l490n
@ m4l490n - ini akan berfungsi ok The redirection dan eksekusi bersyarat operator memiliki prioritas yang lebih tinggi dalam batch script ( <, >, >>, &, &&, ||, |)
npocmaka
13

Entah memanggil exe langsung dari file batch, atau menggunakan start /waitakan bekerja tetapi ada peringatan.

Jika exe yang Anda panggil kemudian membuat proses lain, seperti memanggil exe lain, dan kemudian keluar file batch akan melanjutkan pemrosesan setelah exe yang dipanggil berakhir, karena ia tidak memiliki pengetahuan tentang proses lain yang dimulai olehnya.

Dalam kasus Anda ini adalah masalah nyata karena installer biasanya mengekstrak file dari beberapa bentuk wadah terkompresi, yang mungkin tertanam dalam exe itu sendiri, kemudian jalankan salah satu file yang diekstraksi dan keluar. Beberapa installer menyediakan parameter baris perintah yang memberi tahu exe asli untuk tidak keluar sampai seluruh instalasi selesai, jadi itu sesuatu yang mungkin ingin Anda selidiki. Selain itu, tidak ada jalan nyata dengan file batch saja dan akan mengambil solusi terprogram untuk dipecahkan.

John Gardeniers
sumber
Anda selalu dapat menambahkan loop ke rutinitas shutdown untuk memeriksa untuk melihat apakah msiexec.exe (atau apa pun itu) berjalan dan kemudian menunggu dan loop lagi.
mfinni
@mfinni, hanya untuk memperumit masalah lebih jauh, msiexecseringkali juga memicu proses lainnya. :(
John Gardeniers
1
Sebenarnya, mengapa Anda membutuhkannya start /wait? Saya sendiri percaya itu perlu digunakan start /waituntuk memblokir file batch sampai GUI (sebagai lawan dari konsol) selesai. Tetapi mengujinya sekarang, saya melihat bahwa file batch benar-benar menunggu bahkan untuk aplikasi GUI. Saya telah memposting pertanyaan terkait: Mengapa aplikasi GUI memblokir file batch?
Martin Prikryl
Saya punya masalah ini, menambahkan solusi saya sebagai jawaban.
FreeSoftwareServers
5

Berikut ini adalah contoh menggunakan MATLAB! Saya berasumsi bahwa setup path untuk MATLAB telah selesai dan exit MATLAB sedang dipastikan oleh file FileName.m (atau pengguna telah menentukannya secara internal).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit
Rachit Kumar
sumber
2
Dengan asumsi Matlab agak aneh bagi saya, terutama di serverfault.
Erik
Ini dapat bekerja untuk hal lain selain MATLAB. Ubah saja "MATLAB.exe" menjadi sesuatu yang lain. Dan mungkin perbaiki 'find' kedua untuk mencari exe lagi di output yang difilter.
Oliver Bock
1

Saya punya masalah @John Gardeniers Seandainya atau dijelaskan, di mana exe saya memanggil exe lain dan diakhiri, karena itu mulai / menunggu tidak bekerja. Saya membuat "while loop" untuk memeriksa apakah itu berjalan dan kemudian melanjutkan setelah selesai. Waktu dapat diubah sesuai dengan kebutuhan Anda.

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
sumber
0

Anda dapat menggunakan perintah mulai / tunggu. Ini memulai aplikasi dan menunggu sampai selesai.

Atau jika Anda tahu berapa lama untuk mengeksekusi, Anda dapat melihat pada perintah sleep, yang disediakan oleh Windows Server 2003 Resource Kit Tools . Sleep.exe dapat digunakan untuk menjeda bets Anda selama beberapa detik untuk memungkinkan program untuk menginstal sepenuhnya sebelum file batch dilanjutkan untuk menginstal apa pun. Ada beberapa program yang mengabaikan sintaks "mulai / tunggu", karena program itu sendiri meluncurkan proses lain, maka sleep.exe sangat berguna.

Guido van Brakel
sumber