Làm thế nào để bạn chờ đợi một exe hoàn thành trong tập tin bó?


43

Tôi đang cố gắng tạo một tập lệnh để thực thi exe khi tắt máy để cài đặt sp1. kịch bản của tôi đi một cái gì đó như (không phải kịch bản bat thực tế).

If installed GOTO END
    Install.exe
END:

Vấn đề của tôi là khi nó chạy, nó khởi động trình cài đặt, sau đó kết thúc tập lệnh bởi vì trình cài đặt là một quy trình khác và tiếp tục bằng cách tắt quá trình cài đặt vì máy tính tắt và tắt hệ thống (ít nhất, đó là những gì tôi nghĩ nó đang làm.)

Có cách nào để bảo nó đợi cho đến khi quá trình nó bắt đầu hoàn thành và sau đó tắt máy không?

Câu trả lời:



23

Một cách ngắn hơn:

Install.exe|more

Cũng thế

install|rem

có thể được sử dụng, mặc dù cuối cùng bạn sẽ có thể bắt được một số đầu ra của bàn điều khiển. Và đây là lý do nó hoạt động - lệnh piped chờ đầu vào cho đến khi .exe kết thúc


và tại sao là downlvote?
npocmaka

Thật tuyệt vời! Tôi bỏ phiếu cho bạn.
Changwang Zhang

2
chiến thắng này rõ ràng
Fnord

Nếu exe lấy tham số thì sao? làm thế nào sẽ làm việc?
m4l490n

@ m4l490n - nó sẽ hoạt động tốt. Các nhà khai thác chuyển hướng và điều kiện thực hiện có ưu tiên cao hơn trong các kịch bản hàng loạt ( <, >, >>, &, &&, ||, |)
npocmaka

13

Hoặc gọi exe trực tiếp từ tệp bó, hoặc sử dụng start /waitsẽ hoạt động nhưng có một cảnh báo.

Nếu exe bạn gọi sau đó tạo quy trình khác, chẳng hạn như gọi exe khác, rồi thoát tệp bó sẽ tiếp tục xử lý sau khi exe được gọi đã kết thúc, vì nó không có kiến ​​thức về các quy trình khác được bắt đầu bởi nó.

Trong trường hợp của bạn, đây là một vấn đề thực sự bởi vì các trình cài đặt thường trích xuất các tệp từ một số dạng của thùng chứa nén, có thể được nhúng vào chính exe, sau đó bắn ra một trong các tệp được giải nén và thoát. Một số trình cài đặt cung cấp các tham số dòng lệnh cho biết exe gốc không thoát cho đến khi toàn bộ quá trình cài đặt hoàn tất, vì vậy đó là điều bạn có thể muốn điều tra. Ngoài ra, không có cách nào thực sự xoay quanh vấn đề này với các tệp bó và sẽ có một giải pháp lập trình để giải quyết.


Bạn luôn có thể thêm một vòng lặp vào thói quen tắt máy để kiểm tra xem msiexec.exe (hoặc bất cứ thứ gì nó đang xảy ra) đang chạy và sau đó chờ đợi và lặp lại.
mfinni

@mfinni, chỉ để làm phức tạp vấn đề hơn nữa, msiexecthường cũng bắn ra các quy trình khác. :(
John Gardeniers

1
Trên thực tế, tại sao bạn cần start /waittất cả? Bản thân tôi tin rằng cần phải sử dụng start /waitđể chặn tệp bó cho đến khi ứng dụng GUI (ngược lại với bảng điều khiển) kết thúc. Nhưng thử nghiệm nó bây giờ, tôi thấy rằng các tệp bó thực sự chờ đợi ngay cả đối với các ứng dụng GUI. Tôi đã đăng câu hỏi tương ứng: Tại sao ứng dụng GUI chặn một tệp bó?
Martin Prikryl

Tôi đã có vấn đề này, thêm giải pháp của tôi như là một câu trả lời.
FreeSoftwareServers

5

Dưới đây là một ví dụ sử dụng MATLAB! Tôi đã giả định rằng thiết lập đường dẫn cho MATLAB đã được thực hiện và việc thoát MATLAB được đảm bảo bởi tệp FileName.m (hoặc người dùng đã chỉ định nó trong nội bộ).

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

2
Giả sử Matlab có vẻ hơi lạ đối với tôi, đặc biệt là ở đây trên serverfault.
Erik

Điều này có thể làm việc cho những thứ khác ngoài MATLAB. Chỉ cần thay đổi "MATLAB.exe" thành một cái gì đó khác. Và có lẽ sửa lỗi 'tìm' thứ hai đó để tìm kiếm exe một lần nữa trong đầu ra được lọc.
Oliver Bock

1

Tôi gặp vấn đề @John Gardeniers Đã có hoặc mô tả, nơi exe của tôi gọi một exe khác và chấm dứt, do đó bắt đầu / chờ đợi không hoạt động. Tôi đã tạo một "vòng lặp while" để kiểm tra xem nó có chạy không và sau đó tiếp tục khi nó hoàn thành. Thời gian có thể được điều chỉnh cho phù hợp với nhu cầu của bạn.

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

Bạn có thể sử dụng lệnh start / Wait. Điều này bắt đầu một ứng dụng và chờ đợi nó kết thúc.

Hoặc nếu bạn biết phải mất bao lâu để thực thi, bạn có thể xem lệnh ngủ, được cung cấp bởi Windows Server 2003 Resource Kit Tools . Sleep.exe có thể được sử dụng để tạm dừng lô của bạn trong bất kỳ số giây nào để cho phép chương trình cài đặt đầy đủ trước khi tệp bó tiến hành cài đặt bất cứ thứ gì khác. Có một số chương trình bỏ qua cú pháp "bắt đầu / chờ đợi", do chương trình tự khởi chạy một quá trình khác, sau đó, tệp.exe rất hữu ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.