Come posso disabilitare un'attività pianificata usando Powershell?


8

Ho un'applicazione Web che funziona su Windows Server 2008 R2, che ha un gran numero di attività pianificate che si occupano di tutto il backend. Quando eseguo una distribuzione software che tocca il database, devo disabilitare tutte le attività pianificate. Attualmente ho una lunga lista di controllo che devo esaminare manualmente, disabilitando ogni attività pianificata mentre procedo - sicuramente questo è un lavoro maturo per l'automazione con Powershell.

Sfortunatamente, la documentazione di Powershell sembra essere abbastanza timida su come disabilitare un'attività pianificata esistente (e, naturalmente, riattivarla una volta che la versione è stata completata con successo). Posso ottenere un elenco di attività pronte, in esecuzione o disabilitate, ma quale sarà il prossimo?

Risposte:


14

È possibile utilizzare gli oggetti Script Utilità di pianificazione basati su COM :

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

Per abilitare nuovamente l'attività:

$MyTask.Enabled = $true

Quanto sopra funzionerà solo se la shell è elevata e si è un amministratore locale sul server. È possibile creare il proprio cmdlet con quanto sopra:

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
Nota: questo non sembra funzionare per le attività create con at.exe. (Esempio:) AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)". L'errore che otterrai è 0x80041327; L'attività ha proprietà non compatibili con le versioni precedenti di Windows
Signal15,

5

Se stai solo cercando di interrompere TUTTE le attività, potrebbe essere più semplice interrompere il servizio Utilità di pianificazione. Il modulo ScheduledTasks non è disponibile fino a Windows Server 2012, quindi la gestione delle attività non è così semplice come l'arresto e l'avvio di un servizio:

Stop-Service Schedule
Start-Service Schedule

Se per te non funziona schtasks.exe può essere comunque utilizzato da PowerShell per gestire singole attività:

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

1
A partire dal 2008 / Vista e Windows, lo stesso Utilità di pianificazione utilizza Windows per un'ampia gamma di attività di sistema. A seconda della durata, interrompere il servizio Utilità di pianificazione potrebbe non essere una grande idea (anche se è facile).
Mathias R. Jessen,

Sicuro. Il caso d'uso fornito è stato per disabilitare le attività durante la manutenzione, in modo che potesse essere un'opzione praticabile. Ha anche dato la seconda opzione nel caso in cui non fosse soddisfatta.
Tim Ferrill,


3

Anche un modo migliore in cui non è necessario specificare i nomi delle attività:

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

0

Questo è perfetto! Funziona meglio di Get-ScheduledTask da quando mi trovo in un ambiente misto 2008/2012. Ho aggiunto alcune righe per interrogare AD e invocare questo comando su un gruppo di computer. Il mio obiettivo era disabilitare l'attività di "Server Manager" che si apriva ogni volta che un utente accede. Presto! tutto finito!

$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

Guarda questa funzione

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

}

Ad esempio, è possibile disabilitare tutte le attività nella cartella "\ mysql" chiamando Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Questi frammenti di codice provengono da Come disabilitare / abilitare l'attività pianificata in batch da PowerShell , è possibile scaricare lì l'archivio di esempio completo.


0

questo ha funzionato per me

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.