Windows 7 任务计划程序允许我在计算机空闲时运行任务,但当计算机从空闲状态恢复或不再空闲时似乎没有任何明显的方法来运行任务。
当计算机不再空闲时,Windows 中肯定会触发某些事件(事件日志?)?或者有某种方法可以捕获计算机不再空闲的事实,并通过计划任务对此做出响应?
我该如何做呢?
或者,最糟糕的是,是否存在一个命令行程序可以在计算机进入/退出空闲状态时调用命令或事件?
[更新:] 我回复 Diogo Rocha 的方法有效。我通过 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 开关,以便在部署到的计算机上实际运行该程序)来检查空 exe 是否正在运行。如果它正在运行,%ERRORLEVEL% 环境变量将设置为 0,因为 pslist 运行时没有错误。如果该环境变量为 1,则运行时出现错误(它没有找到正在运行的可执行文件)。我正在利用批处理脚本中的该环境变量来运行另一个任务,如果计算机不是闲置的。
答案1
我认为不可能实现任何方法来检测空闲事件(进入或退出空闲状态)的触发“边界”,但是有一个命令可以强制 Windows 进入空闲状态并运行空闲触发的任务:
Rundll32.exe advapi32.dll,ProcessIdleTasks
您可以组合另一个事件(来自事件日志)来运行此命令,从而触发必须在空闲状态下运行的另一个任务。据您所知,您可以自由组合任何您想要的任务。