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

Powershell 在任务计划中添加第二个触发器,powershell,octopus-deploy,windows2012,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

拥有一个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            
 }
试图在命令行上添加另一个触发器作为同一taskname的一部分,将无法使用
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
将触发器组合成一个触发器来实现这一点吗


可以通过使用不同的taskname创建单独的任务计划来完成,但这并不理想,将任务导出为xml然后再导入也不理想

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

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

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

使用您希望稍后导入的触发器集导出现有任务。PowerShell还可以通过
[xml]
强制转换和
选择xml
以本机方式理解xml文件,因此您不仅限于静态xml文件,还可以根据需要动态更改现有文件

根据您使用的系统,您还可以访问PowerShell任务操纵cmdlet,例如允许配置多个任务。这些可以在Windows Server 2012 R2和Windows 8.1上找到。从中提取一个小片段


由于您标记了2012,如果不是8.1,您可能可以在您自己的系统的PSSession中运行这些cmdlet,这是否也适用于添加事件?例如,ATaskName将有一个在凌晨1点运行的操作,它还将有一个正在查找事件id的事件并相应地进行操作?嗯。。。那一个我想不起来。我正在研究。新的ScheduledTaskRigger包括登录、启动和时间。。。。不过,没有看到事件的引用。是否发现使用
/sc ONEVENT
会破坏任何现有的
/sc WEEKLY | DAILY
等。顺便说一句,为什么xml不适合您?这是Octopus部署中的一个自定义步骤,并且要求对其他部署尽可能通用。是否提到导出/导入xml不适合您。不过谢谢。是的,我播了。但这是我发现的唯一相对容易实现的解决方案。如果需要,您可以扩展它并动态更改XML。正如@Matt所问的,为什么不想使用XML方式?
$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”