Powershell v4。创建远程任务计划程序任务集以使其过期和删除

时间:2015-03-30 01:36:37

标签: powershell scheduled-tasks

我正在尝试创建一个基本上重新启动服务器的任务,但是任务是由运行检查的远程服务器放在那里,以查看是否需要重新启动。我试图添加一个到期时间,因此它会自行删除,但无法找到放置该设置的位置或者它是什么。它与结束边界或其他东西有关,这个设置-DeleteExpiredTaskAfter但不知道要放入什么值。

$dc = "server2reboot"
$taskname = "Reboot $DC"
$taskpath  = "PendingReboots"
$CimSession = New-CimSession -ComputerName $dc -Credential $credentials -Authentication Negotiate

Function Create-AndRegisterRebootTask{
 Param ($taskname, $taskpath)
 $action = New-ScheduledTaskAction -Execute '#shutdown.exe -r -f -t 0"'
 $trigger =  New-ScheduledTaskTrigger -once -At ("$nextsundaydate 3:00") -RandomDelay 03:00:00 
 Register-ScheduledTask -CimSession $cimsession -RunLevel Highest  -Action $action -Trigger $trigger -TaskName $taskname -Description "Server Reboot" -TaskPath $taskpath -Force
 }



Function Create-NewRebootTaskSettings{
 Param ($taskname, $taskpath)
 $settings = New-ScheduledTaskSettingsSet -DeleteExpiredTaskAfter "PT0S" -compatability "win8" -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit "PT1H" -RestartCount 3
 Set-ScheduledTask -CimSession $cimsession -TaskName $taskname -Settings $settings -TaskPath $taskpath
 }

Create-AndRegisterRebootTask -taskname $taskname -taskpath $taskpath 
Create-NewRebootTaskSettings -taskname $taskname -taskpath $taskpath 

Set-ScheduledTask : The task XML is missing a required element or attribute.
(48,4):EndBoundary:
At line:5 char:2
+  Set-ScheduledTask -CimSession $cimsession -TaskName $taskname -Settings $settin ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (PS_ScheduledTask:Root/Microsoft/...S_ScheduledTask) [Set-ScheduledTask], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041319,Set-ScheduledTask

4 个答案:

答案 0 :(得分:4)

Craig Duff的帮助下,以下是如何创建在没有兼容性标志并使用PS4.0 cmdlet运行后删除的任务:

$run = (Get-Date).AddMinutes(2) # Two minutes from now
Register-ScheduledTask -TaskName "MyTask"  -User "Domain\User" -InputObject (
  (
    New-ScheduledTask -Action (
      New-ScheduledTaskAction -Execute "C:\path\to\your.exe" -Argument (
        "many" + 
        "arguments " +
        """with quotes"" "
      )
    ) -Trigger (
      New-ScheduledTaskTrigger -Once -At ($run.TimeOfDay.ToString("hh\:mm")) # As a "TimeOfDay" to get 24Hr format
    ) -Settings (
      New-ScheduledTaskSettingsSet  -DeleteExpiredTaskAfter 00:00:01 # Delete one second after trigger expires
    ) 
  ) | %{ $_.Triggers[0].EndBoundary = $run.AddMinutes(60).ToString('s') ; $_ } # Run through a pipe to set the end boundary of the trigger
)

问题是触发器必须定义EndBoundary,以便可以删除任务。 New-ScheduledTaskTrigger cmdlet没有用于定义它的参数。然后诀窍是创建任务并在两个不同的步骤中注册它,其间有一个步骤来定义触发器的结束边界。显然,如果您的任务有多个触发器,则需要为每个触发器设置End Boundary。

此特定示例创建一个任务,在将来两分钟调用c:\path\to\your.exe后运行MyTask,并使用凭据Domain\User运行。触发器将在执行开始后一小时到期(这样有人可以验证它是否从计划任务窗口运行,而不是浏览Windows日志),然后在一秒钟之后删除该任务。

答案 1 :(得分:3)

此错误是由Vista中的任务计划程序中引入的错误引起的。 在这里阅读更多"The task XML is missing a required element or attribute" error when you use the /z switch together with the Schtasks command in Windows Vista

如果要使用-DeleteExpiredTaskAfter参数,解决方法是创建与Windows Vista之前的平台兼容的任务。

这是

-Compatibility V1

或在您的代码中

$settings = New-ScheduledTaskSettingsSet -Compatibility V1 -DeleteExpiredTaskAfter 00:00:01 -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -ExecutionTimeLimit 01:00:00 -RestartCount 3

将计划任务设置为过期时,还需要注意其他事项。

有效值。

只有有限数量的值有效参数" -DeleteExpiredTaskAfter"。这些是Imediately(PT0S),30天(P30D),90天(P90D),180天(P180D)和365天(P365D)。

其他先决条件

在将任务设置为过期之前,必须设置一个设置了到期时间(EndBoundary)的触发器。

这就是我现在陷入困境的地方,因为新的PS4.0 cmdlet似乎并不适合这一点。

与此同时,这里是一所旧学校"直接通过Scheduler Service COM接口设置计划任务的方法。

$server = "...."
$domain = $server
$user = "...."
$password = "...."

$ExecuteTime = (Get-Date).AddDays(1)
$ExpireTime = $ExecuteTime.AddMinutes(1)

$taskname = "Reboot $server"
$taskpath  = "PendingReboots"
$taskdesc = "Server Reboot"

$ShedService = new-object -comobject "Schedule.Service"
$ShedService.Connect($server, $user, $domain, $password)

$Task = $ShedService.NewTask(0)
$Task.RegistrationInfo.Description = "$taskdesc"
$Task.Settings.Enabled = $true
$Task.Settings.AllowDemandStart = $true
$Task.Settings.DeleteExpiredTaskAfter = "PT0S"
$Task.Settings.ExecutionTimeLimit = "PT1H"
$Task.Settings.StopIfGoingOnBatteries = $false
$Task.Settings.RestartCount = 3

$trigger = $task.triggers.Create(1) # Creates a "One time" trigger
#    TASK_TRIGGER_EVENT     0
#    TASK_TRIGGER_TIME      1
#    TASK_TRIGGER_DAILY     2
#    TASK_TRIGGER_WEEKLY    3
#    TASK_TRIGGER_MONTHLY   4
#    TASK_TRIGGER_MONTHLYDOW    5
#    TASK_TRIGGER_IDLE      6
#    TASK_TRIGGER_REGISTRATION  7
#    TASK_TRIGGER_BOOT      8
#    TASK_TRIGGER_LOGON     9
#    TASK_TRIGGER_SESSION_STATE_CHANGE  11

$trigger.StartBoundary = $ExecuteTime.ToString("yyyy-MM-dd'T'HH:mm:ss")
$trigger.EndBoundary = $ExpireTime.ToString("yyyy-MM-dd'T'HH:mm:ss")
$trigger.Enabled = $true

$Action = $Task.Actions.Create(0)
$action.Path = "shutdown.exe"
$action.Arguments = " -r -f -t 0"

Try {$taskFolder = $ShedService.GetFolder("\$taskpath")}
catch {$taskFolder = $ShedService.GetFolder("\").CreateFolder("$taskpath")}

$result = $taskFolder.RegisterTaskDefinition("$TaskName",$Task,6,"System",$null,5)

答案 2 :(得分:0)

这将创建任务,然后使用expires和delete值更新它,允许设置EndBoundary值。以下示例将过期和删除设置为$run的值30天。

确保将运行时间设置为将来至少一分钟,以允许在运行之前更新任务。

$run = (Get-Date).AddMinutes(1);
$action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument 'C:\temp\install-<whateveryouneed>.ps1' -WorkingDirectory 'C:\temp'
$trigger = New-ScheduledTaskTrigger -Once -At $run

$settings = New-ScheduledTaskSettingsSet -Compatibility Win8
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "Install 
from scheduled task" -Description "Installs stuff from a scheduled task as system" -User "system" -Settings $settings

$task = (Get-ScheduledTask -TaskName "Install 
from scheduled task")
$task.Triggers[0].EndBoundary = $run.AddDays(30).ToString('s')
$task.Settings.DeleteExpiredTaskAfter = "P30D"
Set-ScheduledTask -InputObject $task

答案 3 :(得分:0)

$Action = New-ScheduledTaskAction -Execute powershell.exe -Argument "-WindowStyle Hidden -Command Get-Date"
$Trigger = New-ScheduledTaskTrigger -AtLogon
$Settings = New-ScheduledTaskSettingsSet -Compatibility Win8
$Principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest
$Parameters = @{
    "TaskName"    = "test"
    "Principal"   = $Principal
    "Action"      = $Action
    "Settings"    = $Settings
    "Trigger"     = $Trigger
}
Register-ScheduledTask @Parameters -Force

# In order to use DeleteExpiredTaskAfter, you need to set an StartBoundary & EndBoundary date/time to the trigger
$TargetTask = Get-ScheduledTask -TaskName "test"
$TargetTask.Triggers[0].StartBoundary = [DateTime]::Now.ToString("yyyy-MM-dd'T'HH:mm:ss")
$TargetTask.Triggers[0].EndBoundary = [DateTime]::Now.AddDays(1).ToString("yyyy-MM-dd'T'HH:mm:ss")
# If the task is not scheduled to run again, delete it after: immediately
$TargetTask.Settings.DeleteExpiredTaskAfter = "PT0S"
$TargetTask | Set-ScheduledTask