Trong Windows Task Scheduler, bạn có thể chạy task cả theo lịch trình và sau khi sự kiện cụ thể được ghi trong log. (Đã được mô tả trong bài "Event Triggers in Windows".) Trong bài viết này, chúng ta sẽ xem xét cách tự động khởi động Scheduler task sau khi task trước hoàn thành. Hãy xem thuật toán cấu hình dependency chạy task Scheduler, mà bạn có thể tùy chỉnh để đáp ứng nhu cầu của mình.
Trong trường hợp của tôi, sau khi một script hoàn thành, tôi phải khởi động script khác từ tài khoản user khác. Vì vậy, các hành động này không thể gộp vào một task duy nhất.
Giả sử, chúng ta phải khởi động task Scheduler Pong sau khi task Ping hoàn thành. Khi bất kỳ task nào được khởi động hoặc hoàn thành, thông tin về sự kiện này được ghi trong system log. Chúng ta sẽ tập trung vào sự kiện hoàn thành task Ping.
Mở console Task Scheduler (Taskschd.msc), tìm và chọn sự kiện Ping, và ở panel dưới cùng đi đến tab History, chứa thông tin về tất cả sự kiện liên quan đến task này. Chúng ta cần sự kiện với Event ID 102 (Task completed) được tạo sau khi task hoàn thành.
Mở mô tả chi tiết sự kiện bằng cách vào tab Detail và bật chế độ XML View của sự kiện. Theo dữ liệu XML, bạn có thể lấy tất cả chi tiết sự kiện cần thiết để tạo filter. Cụ thể, chúng ta cần:
EventID: 102
Provider-Name: Microsoft-Windows-TaskScheduler
Channel: Microsoft-Windows-TaskScheduler/Operational
TaskName: \ping
Khi tạo trigger cho task Pong, chúng ta phải tạo điều kiện trigger để task khởi động khi sự kiện ID 102 xuất hiện trong log (Task trigger On an event). Nhưng vấn đề là EventID 102 xuất hiện sau khi bất kỳ task nào hoàn thành, không chỉ task Ping.
Tuy nhiên, có thể tạo điều kiện chọn sự kiện linh hoạt hơn (Custom) nếu filter tiêu chuẩn không giúp chọn sự kiện đủ chính xác. Click New Event Filter:
Tạo event filter mới bằng cách chỉ định dữ liệu từ XML View của sự kiện:
Events Logs: Microsoft-Windows-TaskScheduler/Operational
Event source: TaskScheduler
Task category: Task completed
Sau đó đi đến tab XML và xem view filter sau (XPath):
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and Task = 102]]</Select>
</Query>
</QueryList>
Thay đổi code XPath thành cái sau, sẽ lọc log và tìm sự kiện TaskCompleted cho task \ping:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and Task = 102]]</Select>
</Query>
</QueryList>
Sau khi thêm sự kiện, thử khởi động task ping. Khi nó hoàn thành, task pong phải được khởi động ngay lập tức.
Giải thích XPath hiển thị bên dưới: