前几天用了Windows PowerShell 3.0中的一个新功能,叫做“计划工作”,它可以非常帅气地允许你把任务脚本作为计划工作运行,并使用“计划任务”引擎去执行。你可以添加类似开机执行这样的触发器。但是我还是遇到了一个纠结的问题。无论怎样在创建一个触发器时,应当让它在5秒钟以后生效,这样就可以确保即使再慢的机器应当也不至于触发器还没工作就过期。
那我就做个演示:
Register-ScheduledJob -name quicktest -ScriptBlock { 1; sleep 5; 2} -Trigger (New-JobTrigger -Once -At (get-date).AddSeconds(4)) sleep 6 get-job quicktest | wait-job | Receive-Job
上面的脚本会注册一个计划工作,几秒之后再触发。然后等待几秒钟确保它被触发了。接着使用get-job,他可以获取计划工作的一个工作实例,再等到接收到数据。这段脚本本身的逻辑没有问题,运行起来也很完美。但是有一次我给别人做演示时,奇怪的事情发生了,Job似乎没有触发执行。我再尝试了多次无果。从PowerShell这边来看,应当不会发生预期的错误啊。
于是,我去计划任务中逛了一圈。PowerShell默认保存计划任务的路径是:\Microsoft\Windows\PowerShell\ScheduledJobs。
啊哈,终于逮到这个元凶了。我使用了我自己的笔记本做演示,即使电量充足,默认在电池模式下,计划任务也不会执行(当然这不是坏事)。
PSV3没有捕获到这个错误,还创建了一个失败的Job实例,稍微有点尴尬啊。与一般的PowerShell习惯保持一致,肯定有用。至少应当有一条命令能显示给用户计划工作的错误和警告啊。
有很多原因可能引起计划工作不能正常执行,比如权限,电池模式,并发问题(默认一次只能有一个Job实例运行,不能一个Job的两个实例重叠)。
在我的例子中,我只需要改一下策略,让它在电池模式下(ScheduledJobOption (New-ScheduledJobOption -StartIfOnBattery),也能运行,即可。但是指不定什么时候还会无任何迹象地运行失败,大家要意识到这些问题,尽量避免它们。
Register-ScheduledJob -name quicktest -ScriptBlock { 1; sleep 5; 2} ` -Trigger (New-JobTrigger -Once -At (get-date).AddSeconds(4)) ` -ScheduledJobOption (New-ScheduledJobOption -StartIfOnBattery) sleep 6 get-job quicktest | wait-job | Receive-Job
原文作者:Karl
原文链接:PS Gotcha: Scheduled Jobs and Battery
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!