在任务计划中添加第二个触发器

时间:2016-09-02 10:50:15

标签: powershell octopus-deploy windows2012

有一个PowerShell脚本,可以创建一个计划任务,通过Octopus部署到Windows 2012服务器。

Function Create-ScheduledTask($TaskName,$RunAsUser,$TaskRun,$Schedule,$StartTime,$StartDate,$Arguments,$RunWithElevatedPermissions,$Days,$Password){
    # set up
    $Command = "schtasks.exe /create /ru `"$RunAsUser`" /tn `"$TaskName`" /tr `"'$($TaskRun)' $Arguments`" $cmdSchedule $cmdDays $cmdStartDate $cmdStartTime /F $cmdInterval $cmdDuration $cmdRunLevel $cmdPassword"

    echo $Command
    Invoke-Expression $Command            
 }

尝试在命令行上添加另一个触发器作为同一任务名的一部分,将无法与schtasks.exe一起使用,这似乎与可以完成的GUI相矛盾。

这是用于创建事件触发器的函数,理想情况是将其附加到同一个计划任务。

Function Create-ScheduledTaskEvent($TaskName,$RunAsUser,$TaskRun,$Arguments,$RunWithElevatedPermissions,$Password, $xPath, $channelName){

    $cmdRunLevel = if(-Not $RunWithElevatedPermissions){""}else{"/rl HIGHEST"}
    $cmdPassword = if([string]::IsNullOrEmpty($Password)){""}else{"/rp `"$Password`""}
    $cmdXPath = if([string]::IsNullOrEmpty($xPath)){""}else{"/sc ONEVENT /MO `"$xPath`" "}
    $cmdRunLevel = if(-Not $RunWithElevatedPermissions){""}else{"/rl HIGHEST"}

    $Command = "schtasks.exe /create $cmdRunLevel /ru `"$RunAsUser`" $cmdXPath /tn `"$TaskName`" /tr `"'$($TaskRun)' $Arguments`" /ec `"$channelName`" "

    echo $Command          
    Invoke-Expression $Command            
 }

问题是,用/create替换开关/change只会破坏先前计划任务的触发/操作。

任何想法如何通过命令行上的schtasks.exe来完成,将触发器组合成一个。

可以通过创建具有不同任务名称的单独任务计划来完成,但这不是理想的,也不是将任务导出为xml然后导入。

2 个答案:

答案 0 :(得分:0)

我有类似的任务,我发现最优雅的解决方案是使用GUI在测试环境/本地PC上创建计划任务并将其导出为XML。然后复制XML格式的文本并将其嵌入到脚本中,执行后脚本将此字符串块保存为本地XML文件并运行schtasks.exe以创建新任务。

schtasks.exe /create /RU "NT AUTHORITY\SYSTEM" /TN TaskName /XML "XMLFolder\TaskName.xml"

答案 1 :(得分:0)

schtasks.exe不允许您通过基本开关执行此操作。为了能够使用schtasks.exe执行此操作,您可以使用现有任务的as mentioned on SU的XML导入。

Scheduled Tasks GUI

使用您希望稍后导入的触发器设置导出现有任务。 PowerShell还可以通过[xml]强制转换和Select-XML本地理解xml文件,因此您不仅可以使用静态XML文件,还可以根据需要随时更改现有文件。

根据工作的系统,您还可以访问PowerShell任务操作cmdlet,例如Register-ScheduledTask,它允许配置多个任务。这些可以在Windows Server 2012 R2和Windows 8.1上找到。从TechTarget

中提取一小段代码
$triggers = @()
$triggers += New-ScheduledTaskTrigger -Daily -At 03:00
$triggers += New-ScheduledTaskTrigger -Daily -At 09:00
$triggers += New-ScheduledTaskTrigger -Daily -At 15:00
$triggers += New-ScheduledTaskTrigger -Daily -At 21:00

#..... code truncated to only show trigger portion

$action = New-ScheduledTaskAction -Execute $pstart -Argument $actionscript
Register-ScheduledTask -TaskName $taskname -Action $action -Trigger $triggers -RunLevel Highest -Description “Test job”

自从您标记了2012以来,如果它不是8.1,您可能可以在自己的系统中运行PSSession中的cmdlet