Wie kann ich eine geplante Aufgabe mit Powershell deaktivieren?

8

Ich habe eine Webanwendung, die unter Windows Server 2008 R2 ausgeführt wird und eine große Anzahl geplanter Aufgaben enthält, die sich um alle Backend-Aufgaben kümmern. Wenn ich eine Softwarebereitstellung durchführe, die die Datenbank berührt, muss ich alle geplanten Aufgaben deaktivieren. Derzeit habe ich eine lange Checkliste, die ich manuell durchlaufen muss, um jede geplante Aufgabe zu deaktivieren. Dies ist sicherlich ein Job, der für die Automatisierung mit Powershell reif ist.

Leider scheint die Powershell-Dokumentation ziemlich zurückhaltend zu sein, wie Sie eine vorhandene geplante Aufgabe deaktivieren (und sie natürlich wieder aktivieren, sobald die Version erfolgreich abgeschlossen wurde). Ich kann eine Liste mit fertigen, laufenden oder deaktivierten Aufgaben erhalten, aber wie geht es weiter?

David Keaveny
quelle

Antworten:

14

Sie können die COM-basierten Taskplaner-Skriptobjekte verwenden :

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

So aktivieren Sie die Aufgabe erneut:

$MyTask.Enabled = $true

Dies funktioniert nur, wenn die Shell erhöht ist und Sie ein lokaler Administrator auf dem Server sind. Mit dem oben genannten können Sie Ihr eigenes Cmdlet erstellen:

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
quelle
2
Hinweis: Dies scheint bei Aufgaben, die mit erstellt wurden, nicht zu funktionieren at.exe. (Beispiel :) AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)". Der Fehler, den Sie erhalten, ist 0x80041327; Die Aufgabe hat Eigenschaften, die nicht mit früheren Versionen von Windows kompatibel sind
Signal15
5

Wenn Sie nur versuchen, ALLE Aufgaben zu stoppen, ist es möglicherweise einfacher, den Taskplaner-Dienst zu beenden. Das ScheduledTasks-Modul ist erst unter Windows Server 2012 verfügbar. Daher ist das Verwalten von Aufgaben nicht so einfach wie das Beenden und Starten eines Dienstes:

Stop-Service Schedule
Start-Service Schedule

Wenn dies bei Ihnen nicht funktioniert, kann schtasks.exe weiterhin in PowerShell zum Verwalten einzelner Aufgaben verwendet werden:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE
Tim Ferrill
quelle
1
Ab 2008 / Vista verwendet Windows selbst den Taskplaner häufig für eine Vielzahl von Systemaufgaben. Je nach Dauer des Taskplaner - Dienst zu stoppen nicht so eine gute Idee sein könnte (obwohl es ist einfach).
Mathias R. Jessen
Sicher. Der angegebene Anwendungsfall war das Deaktivieren der Aufgaben während der Wartung, sodass dies eine praktikable Option sein könnte. Gab auch die zweite Option für den Fall, dass der Bedarf nicht erfüllt würde.
Tim Ferrill
3

Noch besser, wenn Sie keine Namen für die Aufgaben angeben müssen:

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

Dies ist perfekt! Es funktioniert besser als Get-ScheduledTask, da ich mich in einer gemischten Umgebung von 2008/2012 befinde. Ich habe ein paar Zeilen hinzugefügt, um AD abzufragen und diesen Befehl für eine Gruppe von Computern aufzurufen. Mein Ziel war es, die Aufgabe des "Server-Managers" zu deaktivieren, der jedes Mal geöffnet wird, wenn sich ein Benutzer anmeldet. Presto! alle weg!

$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
quelle
0

Schauen Sie sich diese Funktion an

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

}

Sie können beispielsweise alle Aufgaben im Ordner "\ mysql" durch Aufrufen deaktivieren Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Diese Codefragmente stammen von So deaktivieren / aktivieren Sie geplante Aufgaben im Batch von PowerShell. Dort können Sie das vollständige Beispielarchiv herunterladen.

Eric
quelle
0

das hat bei mir funktioniert

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
sagte elshazly
quelle