Comment désactiver une tâche planifiée à l'aide de Powershell?

8

J'ai une application Web qui s'exécute sur Windows Server 2008 R2, qui a un grand nombre de tâches planifiées qui s'occupent de tout le backend. Lorsque je fais un déploiement de logiciel qui touche la base de données, je dois désactiver toutes les tâches planifiées. Actuellement, j'ai une longue liste de contrôle que je dois parcourir manuellement, désactivant chaque tâche planifiée au fur et à mesure - c'est certainement un travail mûr pour l'automatisation avec Powershell.

Malheureusement, la documentation de Powershell semble assez timide sur la façon dont vous désactivez une tâche planifiée existante (et bien sûr, la réactivez une fois la publication terminée avec succès). Je peux obtenir une liste des tâches prêtes, en cours d'exécution ou désactivées, mais que faire ensuite?

David Keaveny
la source

Réponses:

14

Vous pouvez utiliser les objets de script du Planificateur de tâches basés sur COM :

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

Pour réactiver la tâche:

$MyTask.Enabled = $true

Ce qui précède ne fonctionnera que si le shell est élevé et que vous êtes un administrateur local sur le serveur. Vous pouvez créer votre propre applet de commande avec ce qui précède:

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
}
Mathias R. Jessen
la source
2
Remarque: cela ne semble pas fonctionner pour les tâches créées avec at.exe. (Exemple:) AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)". L'erreur que vous obtiendrez est 0x80041327; La tâche a des propriétés qui ne sont pas compatibles avec les versions précédentes de Windows
Signal15
5

Si vous essayez simplement d'arrêter TOUTES les tâches, il peut être plus facile d'arrêter simplement le service Planificateur de tâches. Le module ScheduledTasks n'est pas disponible avant Windows Server 2012, donc la gestion des tâches n'est pas aussi simple que l'arrêt et le démarrage d'un service:

Stop-Service Schedule
Start-Service Schedule

Si cela ne fonctionne pas pour vous, schtasks.exe peut toujours être utilisé à partir de PowerShell pour gérer les tâches individuelles:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE
Tim Ferrill
la source
1
À partir de 2008 / Vista et au-delà, Windows lui-même utilise fortement le Planificateur de tâches pour une grande variété de tâches système. Selon la durée, l'arrêt du service Planificateur de tâches peut ne pas être une excellente idée (bien que cela soit facile).
Mathias R. Jessen
Sûr. Le cas d'utilisation donné était pour désactiver les tâches pendant la maintenance, ce qui pourrait être une option viable. A également donné la deuxième option au cas où cela ne répondrait pas au besoin.
Tim Ferrill
3

Encore mieux quand vous n'avez pas besoin de spécifier les noms des tâches:

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

C'est parfait! Cela fonctionne mieux que Get-ScheduledTask car je suis dans un environnement mixte 2008/2012. J'ai ajouté quelques lignes pour interroger AD et appeler cette commande sur un groupe d'ordinateurs. Mon objectif était de désactiver la tâche d'ouverture du "Gestionnaire de serveur" à chaque fois qu'un utilisateur se connecte. Presto! tous partis!

$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}
}
hans57sauc
la source
0

Regardez cette fonction

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

}

Par exemple, vous pouvez désactiver toutes les tâches du dossier "\ mysql" en appelant Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Ces extraits de code proviennent de Comment désactiver / activer la tâche planifiée en lot par PowerShell , vous pouvez y télécharger l'exemple d'archive complet.

Eric
la source
0

cela a fonctionné pour moi

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
saad elshazly
la source