2013-11-28 14 views
7

Tôi đang cố gắng viết một tập tin thực thi có hai điều:Làm cách nào để bạn đợi tác vụ Task Scheduler để kết thúc trong một tập tin batch hoặc C#?

  1. Đầu tiên nó khởi chạy trình cài đặt (install.exe) cài đặt chương trình (program.exe).
  2. Thứ hai nó khởi chạy một phiên bản chương trình đã cài đặt (program.exe). Điều này phải được thực hiện sau khi cài đặt hoàn tất.

Điều này sẽ tương đối đơn giản, ngoại trừ trình cài đặt cần quyền quản trị và phải chạy trong ngữ cảnh người dùng. Ngay cả với những hạn chế này vẫn sẽ là tương đối đơn giản ngoại trừ việc tôi đang chạy này trên một Role Azure Worker, có nghĩa là hai điều:

  1. Elevated batch files must be run from a startup task.
  2. There is no user context for startup tasks in Azure worker roles.

Do đó, dường như là giải pháp là run the installer as a Task Scheduler task in a real user context. Tuy nhiên, điều này đi kèm với các caveat rằng tôi sau đó sẽ cần phải chờ đợi cho công việc này để kết thúc trước khi tôi có thể khởi chạy program.exe.

Vì vậy, câu hỏi của tôi là: Làm cách nào để đợi tác vụ Lập lịch tác vụ kết thúc trong một tệp lô?

Ngoài ra, tôi có thể chuỗi kết nối hai cuộc gọi trong tập tin batch của mình trong một nhiệm vụ Task Scheduler (Task Scheduler hỗ trợ tối đa 16 sự kiện tuần tự trong một nhiệm vụ đơn [Citation Needed]).

Tuy nhiên, nếu tôi thực hiện phương pháp này, tệp lô của tôi sẽ chấm dứt ngay sau khi nhiệm vụ là được lập lịch, không ngay sau khi nó kết thúc. Thật không may, tôi phải chờ đợi nó để hoàn thành trước khi tôi có thể làm bất kỳ logic trong vai trò công nhân của tôi. Tuy nhiên, nếu tôi có thể kiểm tra xem tác vụ Task Scheduler đã kết thúc từ C# (KHÔNG có đặc quyền quản trị viên) thì tôi chỉ có thể đợi nó ở đó.

Do đó, câu trả lời khả thi thứ hai sẽ là câu hỏi: Làm cách nào để kiểm tra xem tác vụ Task Scheduler đã hoàn thành từ C# chưa?

EDIT: Tôi nghĩ tôi sẽ làm rõ câu trả lời dưới đây của MC NĐ một chút:

Từ một mức độ cao, lệnh này kiểm tra xem nếu nhiệm vụ đang chạy, và sau đó nó ngủ và vòng nếu nó Là.

:loop 
for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"') do (
    if "%%f"=="Running" (
     ping -n 6 localhost >nul 2>nul 
     goto loop 
    ) 
) 

Cuộc gọi schtasks /query /tn yourTaskName /fo list đầu ra giống như sau:

Folder: \ 
HostName:  1234567890 
TaskName:  \yourTaskName 
Next Run Time: 11/27/2030 11:40:00 PM 
Status:  Ready 
Logon Mode: Interactive/Background 

Các cho vòng lệnh trên mỗi dòng ở đầu ra. Mỗi dòng được chia thành hai thẻ bằng dấu phân tách ":". Nếu một dòng bắt đầu bằng "Trạng thái" được tìm thấy, thì mã thông báo sau dấu phân cách trong dòng đó được lưu trữ trong biến f (trong ví dụ đầu ra ở trên sẽ là "Sẵn sàng").

Biến f sau đó được chọn để xem nó có khớp với trạng thái "Đang chạy" hay không. Nếu trạng thái không phải là "Đang chạy", giả định rằng tác vụ đã hoàn thành hoặc không thành công và vòng lặp thoát ra. Nếu trạng thái là "Đang chạy", thì nhiệm vụ vẫn đang chạy và tập lệnh batch tạm dừng trong một thời gian ngắn trước khi kiểm tra lại. Điều này được thực hiện bằng cách thực hiện cuộc gọi ping, vì lô không có lệnh ngủ.Một khi kịch bản được thực hiện ngủ nó khởi động lại trình tự này.

Trả lời

8

Từ tập tin batch, truy vấn tình trạng công việc, và nếu nó đang chạy, giữ truy vấn

:loop 
for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"') do (
    if "%%f"=="Running" (
     ping -n 6 localhost >nul 2>nul 
     goto loop 
    ) 
) 
+0

Hoạt động như một sự quyến rũ. Mặc dù tôi đổi chỗ: 'ping -n 1 -w 1000 192.0.2.2> nul 2> nul' làm lệnh tạm dừng của tôi. Tôi cảm thấy dễ dàng hơn để gỡ lỗi theo cách đó để đảm bảo nó hoạt động. –

4

Bạn cũng có thể thoát khỏi lệnh ping -n hacky bằng cách sử dụng timeout.

Đây là câu trả lời của MC ND với timeout. Các 1 trong mẫu là viết tắt của 1 giây.

:loop 
for /f "tokens=2 delims=: " %%f in ('schtasks /query /tn yourTaskName /fo list ^| find "Status:"') do (
    if "%%f"=="Running" (
     timeout /T 1 /NOBREAK > nul 
     goto loop 
    ) 
) 
Các vấn đề liên quan