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


8

我有一个在Windows Server 2008 R2上运行的Web应用程序,该应用程序具有大量计划任务,可以处理所有后端工作。当我进行涉及数据库的软件部署时,我需要禁用所有计划的任务。目前,我有一个漫长的清单,需要手动执行,以禁用每个计划的任务-当然,对于Powershell自动化,这是一项成熟的工作。

不幸的是,Powershell文档似乎对如何禁用现有的计划任务(当然,一旦发行成功完成就重新启用它)显得束手无策。我可以获得已准备好,正在运行或已禁用的任务的列表,但是接下来呢?

Answers:


14

您可以使用基于COM的Task Scheduler脚本对象

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

要再次启用任务:

$MyTask.Enabled = $true

仅当提升外壳程序并且您是服务器上的本地管理员时,以上操作才有效。您可以使用上述命令制作自己的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
}

2
注意:这似乎不适用于使用创建的任务at.exe。(例如:)AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)"。您将得到的错误是0x80041327;该任务的属性与Windows的
早期

5

如果您只是尝试停止所有任务,则停止Task Scheduler服务可能会更容易。ScheduledTasks模块直到Windows Server 2012才可用,因此管理任务并不像停止和启动服务那样简单:

Stop-Service Schedule
Start-Service Schedule

如果那对您不起作用,仍可以从PowerShell中使用schtasks.exe来管理单个任务:

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

1
从2008 / Vista开始,Windows本身就大量使用Task Scheduler来执行各种系统任务。根据不同的时间,停止任务计划程序服务可能不是一个好主意(虽然它容易)。
Mathias R. Jessen 2014年

当然。给出的用例用于在维护期间禁用任务,因此这是一个可行的选择。如果无法满足需要,还提供了第二个选项。
Tim Ferrill 2014年


3

甚至无需指定任务名称的更好方法:

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

0

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

$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}
}

0

看这个功能

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
            }
        }
    }

}

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.