如何使用Powershell禁用计划任务?

我有一个在Windows Server 2008 R2上运行的Web应用程序,它有大量的计划任务来处理所有的后端工作。 当我做一个触及数据库的软件部署时,我需要禁用所有的计划任务。 目前我有一个很长的清单,我需要手动进行,当我去时禁用每个计划的任务 – 当然这是一个成熟的与Powershell自动化的工作。

不幸的是,Powershell文档对于如何禁用现有的计划任务(当然,一旦发布成功完成后重新启用它)似乎相当费解。 我可以获得已准备就绪,正在运行或已禁用的任务列表,但下一步是什么?

您可以使用基于COM的任务计划程序脚本对象 :

($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("localhost") $MyTask = $TaskScheduler.GetFolder('\').GetTask("My Task") $MyTask.Enabled = $false 

要再次启用该任务:

 $MyTask.Enabled = $true 

只有当shell被提升,并且你是服务器上的本地pipe理员时,以上才会起作用。 你可以用上面的方法创build自己的cmdlet:

 function Disable-ScheduledTask { param([string]$TaskName, [string]$ComputerName = "localhost" ) $TaskScheduler = New-Object -ComObject Schedule.Service $TaskScheduler.Connect($ComputerName) $TaskRootFolder = $TaskScheduler.GetFolder('\') $Task = $TaskRootFolder.GetTask($TaskName) if(-not $?) { Write-Error "Task $TaskName not found on $ComputerName" return } $Task.Enabled = $False } 

如果您只是试图停止所有的任务,那么停止Task Scheduler服务可能会更容易。 ScheduledTasks模块在Windows Server 2012之前不可用,因此pipe理任务不像停止和启动服务那样简单:

 Stop-Service Schedule Start-Service Schedule 

如果这不适用于您,则可以使用PowerShell中的schtasks.exe来pipe理单个任务:

 schtasks.exe /CHANGE /TN "My Task" /DISABLE schtasks.exe /CHANGE /TN "My Task" /ENABLE 

即使是一个更好的方法,你不需要指定任务的名称:

 ($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("localhost") $TaskScheduler.GetFolder('\').GetTasks(0) | % {$_.Enabled = $false} 

这是你在找什么(Disable-ScheduledTask) ?

太棒了! 由于我处于2008/2012混合环境,所以它比Get-ScheduledTask更好。 我添加了几行来查询AD,并针对一组计算机调用此命令。 我的目标是禁用每次用户login时打开“服务器pipe理器”的任务。Presto! 全没了!

 $C=Get-ADComputer -SearchBase 'OU=Computers,dc=domain,dc=com' -Filter * | foreach {$_.name} Invoke-Command $C { ($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("$C") $TaskScheduler.GetFolder('\Microsoft\Windows\Folder').GetTasks(0) | % {$_.Enabled = $false} } 

看看这个function

 Function Control-Tasks { [CmdletBinding()] Param ( [Parameter(Mandatory=$true)][String]$FolderPath, [Parameter(Mandatory=$true, ParameterSetname='EnableTask')][Switch]$Enable, [Parameter(Mandatory=$true, ParameterSetname='DisableTask')][Switch]$Disable, [Parameter()]$TaskScheduler, [Parameter()][Switch]$Recursive ) If ($TaskScheduler -eq $null) { $TaskScheduler = New-Object -ComObject Schedule.Service $TaskScheduler.Connect("localhost") } $curFolder = $TaskScheduler.GetFolder($FolderPath) $curFolder.GetTasks(1) | ForEach-Object { If ($Enable) { $_.Enabled = $True Write-Host "Enable $($_.Path)" } If ($Disable) { $_.Enabled = $False Write-Host "Disable $($_.Path)" } } If ($Recursive) { $curFolder.GetFolders(1) | ForEach-Object { If ($Enable) { Control-Tasks -FolderPath $_.Path -Enable -TaskScheduler $TaskScheduler -Recursive } If ($Disable) { Control-Tasks -FolderPath $_.Path -Disable -TaskScheduler $TaskScheduler -Recursive } } } } 

例如,你可以通过调用Control-Tasks -FolderPath "\mysql" -Disable -Recursive来禁用文件夹“\ mysql”下的所有任务。 Control-Tasks -FolderPath "\mysql" -Disable -Recursive

此代码片段来自如何通过PowerShell批量禁用/启用计划任务 ,您可以在此下载完整的示例档案。