Como posso desativar uma tarefa agendada usando o Powershell?

8

Eu tenho um aplicativo da web que é executado no Windows Server 2008 R2, que tem um grande número de tarefas agendadas que cuidam de todo o material de back-end. Quando faço uma implantação de software que toca o banco de dados, preciso desabilitar todas as tarefas agendadas. Atualmente eu tenho uma lista de verificação longa que eu preciso percorrer manualmente, desabilitando cada tarefa agendada como eu vou - certamente este é um trabalho maduro para automação com Powershell.

Infelizmente, a documentação do Powershell parece ser bastante modesta sobre como você desativa uma tarefa agendada existente (e, claro, reativá-la assim que a liberação for concluída com sucesso). Eu posso obter uma lista de tarefas prontas, em execução ou desativadas, mas o que vem depois?

    
por David Keaveny 05.06.2014 / 06:12

6 respostas

14

Você pode usar o Script do Agendador de Tarefas baseado em COM. objetos :

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

Para ativar a tarefa novamente:

$MyTask.Enabled = $true

O acima só funcionará se o shell for elevado e você for um administrador local no servidor. Você poderia criar seu próprio cmdlet com o seguinte:

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
}
    
por 05.06.2014 / 15:21
5

Se você está apenas tentando parar TODAS as tarefas, pode ser mais fácil simplesmente parar o serviço Agendador de Tarefas. O Módulo ScheduledTasks não está disponível até o Windows Server 2012, portanto, gerenciar tarefas não é tão simples quanto parar e iniciar um serviço:

Stop-Service Schedule
Start-Service Schedule

Se isso não funcionar, o schtasks.exe ainda pode ser usado no PowerShell para gerenciar tarefas individuais:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE
    
por 05.06.2014 / 06:41
3

Até mesmo uma maneira melhor em que você não precisa especificar nomes das tarefas:

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

Isso é perfeito! Ele funciona melhor do que o Get-ScheduledTask, já que estou em um ambiente misto de 2008/2012. Eu adicionei algumas linhas para consultar o AD e invocar este comando contra um grupo de computadores. Meu objetivo era desabilitar a tarefa de abertura do "Gerenciador de Servidores" toda vez que um usuário faz o login. Presto! tudo acabou!

$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}
}
    
por 06.04.2015 / 20:54
0

Veja esta função

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

}

Por exemplo, você pode desativar todas as tarefas na pasta "\ mysql" chamando Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Esses snippets de código vêm de Como desabilitar / habilitar a tarefa agendada em lote pelo PowerShell , você pode baixar o arquivo de amostra completo lá.

    
por 06.04.2017 / 04:30