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

fir*_*247 4 powershell scheduled-tasks

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

一切正常,但默认情况下,如果脚本在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
Run Code Online (Sandbox Code Playgroud)

再次,一切都很好用,直到72小时命中.任何帮助表示赞赏!谢谢!

小智 6

New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0
Run Code Online (Sandbox Code Playgroud)

  • 请在您的答案中添加详细信息 (3认同)

Tre*_*van 5

在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();
Run Code Online (Sandbox Code Playgroud)

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

任务计划程序


小智 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
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是唯一对我有用的方法!微软应该修复这个错误. (3认同)