Назад | Перейти на главную страницу

Как отключить запланированное задание с помощью Powershell?

У меня есть веб-приложение, работающее на Windows Server 2008 R2, в котором есть большое количество запланированных задач, которые заботятся обо всех внутренних компонентах. Когда я выполняю развертывание программного обеспечения, которое касается базы данных, мне нужно отключить все запланированные задачи. В настоящее время у меня есть длинный контрольный список, который мне нужно проходить вручную, отключая каждую запланированную задачу по ходу работы - безусловно, это работа, созревшая для автоматизации с помощью Powershell.

К сожалению, документация Powershell кажется довольно скромной в отношении того, как отключить существующую запланированную задачу (и, конечно же, повторно включить ее после успешного завершения выпуска). Я могу получить список готовых, запущенных или отключенных задач, но что дальше?

Вы можете использовать COM на основе Объекты сценариев планировщика заданий:

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

Чтобы снова включить задачу:

$MyTask.Enabled = $true

Вышеупомянутое будет работать, только если оболочка имеет повышенные права и вы являетесь локальным администратором на сервере. Вы можете создать свой собственный командлет с помощью приведенного выше:

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
}

Если вы просто пытаетесь остановить ВСЕ задачи, может быть проще просто остановить службу планировщика заданий. Модуль ScheduledTasks недоступен до Windows Server 2012, поэтому управление задачами не так просто, как остановка и запуск службы:

Stop-Service Schedule
Start-Service Schedule

Если это не сработает для вас, schtasks.exe все равно можно использовать из PowerShell для управления отдельными задачами:

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

Еще лучший способ, когда вам не нужно указывать имена задач:

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

Это потрясающе! Он работает лучше, чем Get-ScheduledTask, поскольку я нахожусь в смешанной среде 2008/2012. Я добавил несколько строк для запроса AD и вызова этой команды для группы компьютеров. Моей целью было отключить задачу открытия «Диспетчера серверов» каждый раз, когда пользователь входит в систему. Presto! все ушли!

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

Посмотрите на эту функцию

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, вы можете скачать полный архив примеров здесь.

это сработало для меня

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask