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

yi0zb3m4  于 2023-03-12  发布在  Shell
关注(0)|答案(5)|浏览(154)

我有一个脚本,可以合法地运行超过3天(这是一个命令队列脚本,所以它有很多暂停等待作业完成)。我使用PowerShell Register-ScheduledJob cmdlet创建作业。
一切正常,除了默认情况下,Windows任务计划程序将停止脚本,如果它没有完成3天后。我可以通过进入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小时点击。任何帮助都将不胜感激!谢谢!

68de4m5k

68de4m5k1#

New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0

这将返回一个可以传递给Register-ScheduledJob-Settings参数的对象。例如:

Register-ScheduledJob `
    -Settings $(New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0) `
    # ...further arguments...
vql8enpb

vql8enpb2#

刚刚在Server 2012 R2上解决了这个问题,无需使用外部DLL。与Register-ScheduledTask一起工作,但尚未与Register-ScheduledJob一起测试。
我用类似于上面的方法创建了带有Register-ScheduledTask的,但是没有定义ExecutionTimeLimit设置,这给了我3天的默认值。
然后我返回任务并更改设置如下:

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

tv6aics13#

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

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

l2osamch

l2osamch4#

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

New-ScheduledTaskSettingsSet -ExecutionTimeLimit "PT0S"
6fe3ivhb

6fe3ivhb5#

旧帖子,但除了@jdc0589在评论中说的,这些选项对我都不起作用。我在运行Windows Server 2016数据中心的Azure虚拟机上运行此脚本。

$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

相关问题