Какое событие планировщика задач Windows 7 будет реагировать на состояние незавершенного END?

8

Планировщик задач Windows 7 позволяет мне запускать задачу, когда компьютер бездействует, но, кажется, нет никакого очевидного способа выполнить задачу, когда компьютер выходит из режима ожидания или больше не находится в режиме ожидания.

Конечно, есть какое-то событие, вызванное в Windows (журнал событий?), Когда компьютер больше не находится в режиме ожидания? Или каким-то образом зафиксировать тот факт, что компьютер больше не находится в режиме ожидания, и ответить на него запланированной задачей?

Как бы я это сделал?

Или, в худшем случае, есть где-нибудь программа командной строки, которая может вызывать команды или события, когда компьютер входит / выходит из состояния ожидания?

[ОБНОВЛЕНИЕ:] Подход в моем ответе Диого Роче работает. Я создал пустой исполняемый файл через py2exe из этого сценария:

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

- и настроить запланированное задание в Windows, для которого это экспортированный HTML:

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

И оставил мой компьютер без дела 15 минут. Диспетчер задач показал запуск нулевого исполняемого файла. Как только я переместил мышь, компьютер вышел из режима ожидания, и нулевой исполняемый файл исчез из списка задач.

Отсюда вопрос установки задачи (или программы, которую я делаю с Python и py2exe), использующей pslist (с ключом -accepteula, чтобы на компьютерах, на которых он развернут, фактически запускалась программа), проверьте, работает ли null exe. Если он работает, переменная среды% ERRORLEVEL% установлена ​​в 0, потому что pslist запустился без ошибок. Если эта переменная среды равна 1, она запустилась с ошибкой (не нашла исполняемый файл). Я использую эту переменную среды в пакетном скрипте для запуска другой задачи, если компьютер не находится в режиме ожидания.

r_alex_hall
источник
Как вы определяете состояние простоя Windows 7?
Der Hochstapler
Хотел бы я знать. Я видел способы предположительно взломать это; лучший ответ, который я нашел (и протестировал), заключается в том, что состояние простоя, по-видимому, вызвано 15 минутами отсутствия активности пользователя (клавиатура или мышь и т. д.) и небольшим использованием процессора.
r_alex_hall
Просто к вашему сведению, я думаю, что это событие Windows было очень нестабильным (оно не всегда отвечало возобновленной активности пользователей), и цели, которые я стремился достичь с помощью этого вопроса, были намного лучше достигнуты с помощью AutoHotkey, в программе, которую я Разработано: github.com/r-alex-hall/farmComm
r_alex_hall

Ответы:

4

Я не думаю, что можно реализовать какие-либо методы для обнаружения «границы» триггера на событиях простоя (вход или выход из состояния простоя), однако есть команда, которая заставляет вашу Windows входить в состояние простоя и запускать триггерные задачи. :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Вы можете объединить другое событие (из журнала событий) для запуска этой команды, которая, в свою очередь, вызовет другую задачу, которая должна быть запущена в состоянии ожидания. Насколько вы знаете, вы можете свободно комбинировать любые задачи, которые вы можете захотеть.

Диого
источник
1
Хм , , это заставляет меня думать. , , Я мог бы подойти к этому так, без Rundll32.exe. Я мог бы настроить запланированную задачу A для запуска ProgA на простое компьютера, а затем настроить TaskB, которая запускает batchB.bat раз в минуту. BatchB.bat будет использовать Pslist, чтобы проверить, работает ли ProgA (а если нет, запустите ProgB). Это само по себе не сработает, потому что ProgA продолжит работать, даже если компьютер не будет работать. , , НО . , , (Я только что понял!) Есть условие планировщика задач «Остановить [программу], если компьютер перестает работать». Если это убивает выполнение ProgA, то batchB.bat запускает ProgB!
r_alex_hall