通过PowerShell计划的作业将在3天后退出

时间:2014-04-08 17:57:47

标签: powershell scheduled-tasks

我有一个可以合法运行超过3天的脚本(它是一个命令排队脚本,所以它有很多暂停等待工作完成)。我正在使用PowerShell Register-ScheduledJob cmdlet来创建作业。

一切正常,但默认情况下,如果脚本在3天后仍未完成,Windows任务计划程序将停止脚本。我可以通过进入GUI并取消选中'停止任务,如果它运行时间超过:3天'复选框来解决这个问题。我需要能够通过Powershell代码“取消选中”该框。以下是我目前的安排方式:

$immediate = (get-date).AddMinutes(2).ToString("MM/dd/yyyy HH:mm")
$scheduled_date = get-date -Format "yyyyMMMd-HHMMss"
$trigger = New-JobTrigger -Once -At $immediate
$sjo = New-ScheduledJobOption -RunElevated
Register-ScheduledJob -Name "SVC Migrations - $scheduled_date" -ScriptBlock {powershell.exe -File C:\scripts\addvdiskcopy_queue.ps1 } -Trigger $trigger -ScheduledJobOption $sjo >> C:\scripts\temp\job_scheduled.txt

同样,一切都很好用,直到72小时点击。任何帮助表示赞赏! 谢谢!

5 个答案:

答案 0 :(得分:5)

查看this thread on CodePlex

看起来您可以使用任务计划程序托管库来实现此目的。您需要下载库并加载DLL。这是一个完全正常工作的示例(只需更新DLL的路径)。

$TaskName = 'asdf';

# Unregister the Scheduled Job if it exists
Get-ScheduledJob asdf -ErrorAction SilentlyContinue | Unregister-ScheduledJob;

# Create the Scheduled Job
$Trigger = New-JobTrigger -At '5:00 PM' -Once;
$Option = New-ScheduledJobOption;
$Action = { Write-Host 'hi'; };
$Job = Register-ScheduledJob -Name asdf -ScriptBlock $Action -Trigger $Trigger -ScheduledJobOption $Option;

# Modify the Scheduled Job using external library
Add-Type -Path "C:\Users\Trevor\Downloads\TaskScheduler\Microsoft.Win32.TaskScheduler.dll";
$TaskService = New-Object -TypeName Microsoft.Win32.TaskScheduler.TaskService;
$Task = $TaskService.FindTask($TaskName, $true);
$Task.Definition.Settings.ExecutionTimeLimit = [System.TimeSpan]::Zero;
$Task.RegisterChanges();

我在我的环境中测试了库,它按预期工作。最终结果是" 如果任务运行时间超过"则停止任务。复选框已禁用。

Task Scheduler

答案 1 :(得分:5)

New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0

答案 2 :(得分:5)

只需在Server 2012R2上解决这个问题,而无需使用外部DLL。 使用Register-ScheduledTask但尚未使用Register-ScheduledJob进行测试。

我以类似于上面的方式创建了with Register-ScheduledTask,但没有定义ExecutionTimeLimit设置。这给了我默认的3天。

然后我返回任务并更改了如下设置:

$Task = Get-ScheduledTask -TaskName "MyTask"
$Task.Settings.ExecutionTimeLimit = "PT0H"
Set-ScheduledTask $Task

答案 3 :(得分:2)

在任务定义中使用以下设置:

New-ScheduledTaskSettingsSet -ExecutionTimeLimit "PT0S"

答案 4 :(得分:1)

旧帖子,但除了@ jdc0589在评论中所说的内容之外,这些选项都不适用于我。我在运行Windows Server 2016 Datacenter的Azure VM上运行此脚本。

$action = New-ScheduledTaskAction -Execute "java.exe" `
    -Argument "-jar `"D:\Selenium\selenium-grid-extras.jar`"" `
    -WorkingDirectory "D:\Selenium"

$trigger = New-ScheduledTaskTrigger -AtStartup

$everyMinute = New-TimeSpan -Minutes 1
$nolimit = New-TimeSpan -Minutes 0
$settings = New-ScheduledTaskSettingsSet `
    -MultipleInstances IgnoreNew `
    -RestartInterval $everyMinute `
    -RestartCount 999 `
    -Priority 0 `
    -ExecutionTimeLimit $nolimit `
    -StartWhenAvailable `
    -DisallowHardTerminate

Register-ScheduledTask `
    -Action $action `
    -Trigger $trigger `
    -Settings $settings `
    -TaskName "Start SGE Hub" `
    -TaskPath "\Selenium Grid Extras" `
    -Description "At machine startup, run SGE so that the hub can process tests without a logon" `
    -RunLevel Highest `
    -User "SYSTEM" `
    -Force

enter image description here