Sự kiện lập lịch tác vụ windows 7 nào sẽ đáp ứng với điều kiện END nhàn rỗi?


8

Bộ lập lịch tác vụ Windows 7 cho phép tôi chạy một tác vụ khi máy tính không hoạt động, nhưng dường như không có cách rõ ràng nào để chạy một tác vụ khi máy tính hoạt động trở lại khi không hoạt động hoặc không còn hoạt động.

Chắc chắn có một số sự kiện được kích hoạt trong windows (nhật ký sự kiện?) Khi máy tính không còn hoạt động? Hoặc một số cách để nắm bắt thực tế là máy tính không còn hoạt động, và đáp ứng điều đó với một nhiệm vụ theo lịch trình?

Làm thế nào tôi sẽ làm điều này?

Hoặc, tệ nhất, có một chương trình dòng lệnh ở đâu đó có thể gọi các lệnh hoặc sự kiện khi máy tính vào / thoát trạng thái không hoạt động?

[CẬP NHẬT:] Cách tiếp cận trong bài trả lời của tôi cho Diogo Rocha hoạt động. Tôi đã tạo một tệp thực thi null thông qua py2exe từ tập lệnh này:

import sys
import time

#restart a pause every twenty seconds, with two functions that call each other.

def call_pause():
    pause()

def pause():
    time.sleep(20)
    call_pause()

call_pause()

- và thiết lập một tác vụ theo lịch trình trong Windows mà đây là HTML đã xuất:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2012-04-27T17:40:46.8871631</Date>
    <Author>GENIUS-BREATH-COMPY</Author>
    <Description>This task runs ProgA when the computer enters an idle state, and terminates ProgA when the computer *leaves* an idle state. The is all for scheduled TaskB, which periodically runs a batch that tests whether ProgA is running. If ProgA is not running (because this task terminated it), ProgB runs (as the computer is NOT idle). If ProgA *is* running, TaskB's batch does not run ProgB.</Description>
  </RegistrationInfo>
  <Triggers>
    <IdleTrigger>
      <Enabled>true</Enabled>
    </IdleTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-18</UserId>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <Duration>PT1M</Duration>
      <WaitTimeout>PT0S</WaitTimeout>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>true</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>true</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
    <RestartOnFailure>
      <Interval>PT1M</Interval>
      <Count>3</Count>
    </RestartOnFailure>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\path_to\nullExecutable</Command>
    </Exec>
  </Actions>
</Task>

Và để máy tính của tôi nhàn rỗi trong 15 phút. Trình quản lý tác vụ cho thấy null thực thi đang chạy. Ngay khi tôi di chuyển con chuột, nó lấy máy tính ra khỏi trạng thái chờ, và lệnh thực thi null biến mất khỏi danh sách tác vụ.

Từ đây, vấn đề là thiết lập một tác vụ (hoặc chương trình - mà tôi đang làm với Python và py2exe) sử dụng pslist (với một công tắc -accepteula để trên các máy tính được triển khai cho nó sẽ thực sự chạy chương trình) kiểm tra xem null exe có chạy không Nếu nó đang chạy, biến môi trường% ERRORLEVEL% được đặt thành 0 vì pslist chạy không có lỗi. Nếu biến môi trường đó là 1, nó chạy có lỗi (nó không tìm thấy chạy thực thi). Tôi đang khai thác biến môi trường đó trong một tập lệnh bó để chạy một tác vụ khác nếu máy tính không hoạt động.


Làm thế nào để bạn xác định trạng thái nhàn rỗi của Windows 7?
Der Hochstapler

Ước gì tôi biết. Tôi đã thấy những cách được cho là hack đó; câu trả lời tốt nhất tôi đã tìm thấy (và đã kiểm tra) là trạng thái nhàn rỗi dường như được kích hoạt với 15 phút không có hoạt động của người dùng (đầu vào bàn phím hoặc chuột, v.v.) và sử dụng CPU ít.
r_alex_hall

Chỉ là FYI, tôi nghĩ rằng tôi thấy sự kiện Windows này rất dễ xảy ra (nó không phải lúc nào cũng đáp ứng với hoạt động của người dùng được tiếp tục lại) và các mục tiêu tôi tìm kiếm để thực hiện với câu hỏi đã được thực hiện tốt hơn bằng cách sử dụng AutoHotkey, trong một chương trình tôi đã phát triển: github.com/r-alex-hall/farmComm
r_alex_hall

Câu trả lời:


4

Tôi không nghĩ có thể thực hiện bất kỳ phương pháp nào để phát hiện "đường viền" kích hoạt trên các sự kiện nhàn rỗi (nhập hoặc thoát khỏi trạng thái không hoạt động), tuy nhiên, có một lệnh cho phép Windows của bạn vào trạng thái không hoạt động và chạy các tác vụ được kích hoạt nhàn rỗi :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Bạn có thể kết hợp một sự kiện khác (từ nhật ký sự kiện) để chạy lệnh này, lần lượt kích hoạt một tác vụ khác phải được chạy ở trạng thái không hoạt động. Theo như bạn biết, bạn có thể tự do kết hợp bất kỳ nhiệm vụ nào mà bạn có thể muốn.


1
Hừm. . . Điều đó dẫn tôi đến suy nghĩ. . . Tôi có thể tiếp cận nó theo cách đó, mà không cần Rundll32.exe. Tôi có thể thiết lập taskA theo lịch trình để chạy ProgA trên máy tính nhàn rỗi - và sau đó thiết lập một TaskB, chạy batchB.bat mỗi phút một lần. BatchB.bat sẽ sử dụng Pslist để kiểm tra xem ProgA có đang chạy không (và nếu không, hãy chạy ProgB). Điều đó tự nó sẽ không hoạt động vì ProgA sẽ tiếp tục chạy ngay cả khi máy tính không hoạt động. . . NHƯNG . . . (Tôi mới nhận ra!) Có một điều kiện lập lịch tác vụ để "Dừng [chương trình] nếu máy tính không hoạt động". Nếu điều đó giết chết việc thực thi ProgA, thì batchB.bat sẽ chạy ProgB!
r_alex_hall
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.