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, она запустилась с ошибкой (не нашла исполняемый файл). Я использую эту переменную среды в пакетном скрипте для запуска другой задачи, если компьютер не находится в режиме ожидания.

1 ответ1

4

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

Rundll32.exe advapi32.dll,ProcessIdleTasks

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .