Apa tugas penjadwal tugas windows 7 yang merespons kondisi END yang tidak digunakan?

8

Penjadwal tugas Windows 7 memungkinkan saya menjalankan tugas saat komputer idle, tetapi sepertinya tidak ada cara yang jelas untuk menjalankan tugas saat komputer melanjutkan dari idle, atau tidak lagi menganggur.

Tentunya ada beberapa peristiwa yang dipicu di windows (sebuah event log?) Ketika komputer tidak lagi menganggur? Atau beberapa cara untuk menangkap fakta bahwa komputer tidak lagi menganggur, dan menanggapinya dengan tugas terjadwal?

Bagaimana saya melakukan ini?

Atau, paling buruk, adakah program baris perintah di suatu tempat yang dapat memanggil perintah atau kejadian ketika komputer memasuki / keluar dari status siaga?

[PEMBARUAN:] Pendekatan dalam balasan saya untuk Diogo Rocha berfungsi. Saya membuat null dieksekusi melalui py2exe dari skrip ini:

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()

--dan mengatur tugas terjadwal di Windows yang ini adalah HTML yang diekspor:

<?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>

Dan komputer saya diam selama 15 menit. Manajer tugas menunjukkan eksekusi nol yang dapat dijalankan. Segera setelah saya menggerakkan mouse, itu mengambil komputer dari idle, dan eksekusi nol menghilang dari daftar tugas.

Dari sini, ini soal mengatur tugas (atau program - yang saya lakukan dengan Python dan py2exe) yang menggunakan pslist (dengan sakelar -accepteula sehingga pada komputer yang digunakan akan benar-benar menjalankan program) untuk periksa apakah null exe sedang berjalan. Jika sedang berjalan, variabel lingkungan% ERRORLEVEL% diatur ke 0 karena pslist berjalan tanpa kesalahan. Jika variabel lingkungan itu 1, itu berjalan dengan kesalahan (tidak menemukan eksekusi yang dapat dijalankan). Saya mengeksploitasi variabel lingkungan dalam skrip batch untuk menjalankan tugas lain jika komputer tidak siaga.

r_alex_hall
sumber
Bagaimana Anda menentukan status siaga Windows 7?
Der Hochstapler
Seandainya aku tahu. Saya telah melihat cara untuk meretas itu; jawaban terbaik yang saya temukan (dan diuji) adalah bahwa kondisi siaga tampaknya dipicu dengan 15 menit tanpa aktivitas pengguna (input keyboard atau mouse, dll.) dan sedikit penggunaan CPU.
r_alex_hall
Hanya FYI, saya pikir saya menemukan acara Windows ini sangat tidak jelas (tidak selalu merespon aktivitas pengguna yang dilanjutkan), dan tujuan yang ingin saya selesaikan dengan pertanyaan jauh lebih baik dilakukan dengan cara Autohotkey, dalam program I dikembangkan: github.com/r-alex-hall/farmComm
r_alex_hall

Jawaban:

4

Saya rasa tidak mungkin untuk menerapkan metode apa pun untuk mendeteksi "batas" pemicu pada aktivitas idle (masuk atau keluar dari status idle), namun ada perintah yang memaksa Windows Anda untuk masuk pada kondisi idle dan menjalankan tugas yang dipicu idle :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Anda bisa menggabungkan acara lain (dari log peristiwa) untuk menjalankan perintah ini yang pada gilirannya memicu tugas lain yang harus dijalankan pada keadaan siaga. Sejauh yang Anda tahu, Anda dapat dengan bebas menggabungkan tugas apa pun yang Anda inginkan.

Diogo
sumber
1
Hmm. . . itu membuat saya berpikir. . . Saya bisa mendekatinya seperti itu, tanpa Rundll32.exe. Saya bisa mengatur taskA yang dijadwalkan untuk menjalankan ProgA di komputer idle - dan kemudian mengatur TaskB, yang menjalankan batchB.bat sekali dalam satu menit. BatchB.bat akan menggunakan Pslist untuk memeriksa apakah ProgA sedang berjalan (dan jika tidak, jalankan ProgB). Itu dengan sendirinya tidak akan berhasil karena ProgA akan terus berjalan bahkan jika komputer diam. . . TAPI. . . (Saya baru sadar!) Ada kondisi penjadwal tugas untuk "Hentikan [program] jika komputer berhenti menjadi idle". Jika itu membunuh eksekusi ProgA, maka batchB.bat akan menjalankan ProgB!
r_alex_hall