powershell 在任务调度中添加第二个触发器

kd3sttzy  于 2023-01-20  发布在  Shell
关注(0)|答案(2)|浏览(219)

拥有一个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然后再导入回来。

js81xvg6

js81xvg61#

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

导出具有所需触发器集的现有任务,以便稍后导入。PowerShell还可以通过[xml]转换和Select-XML在本机理解xml文件,因此您不限于静态XML文件,还可以根据需要动态更改现有文件。
根据您使用的系统,您还可以访问PowerShell任务操作cmdlet,如Register-ScheduledTask,它允许配置多个任务。这些cmdlet可在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

nr9pn0ug

nr9pn0ug2#

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

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

相关问题