Làm cách nào tôi có thể vô hiệu hóa tác vụ theo lịch trình bằng Powershell?


8

Tôi có một ứng dụng web chạy trên Windows Server 2008 R2, có một số lượng lớn các tác vụ theo lịch trình, đảm nhiệm tất cả các công cụ phụ trợ. Khi tôi thực hiện triển khai phần mềm chạm vào cơ sở dữ liệu, tôi cần phải tắt tất cả các tác vụ theo lịch trình. Hiện tại tôi có một danh sách kiểm tra dài mà tôi cần phải thực hiện thủ công, vô hiệu hóa từng tác vụ theo lịch trình khi tôi đi - chắc chắn đây là một công việc chín muồi để tự động hóa với Powershell.

Thật không may, tài liệu Powershell dường như khá khó hiểu về cách bạn vô hiệu hóa một tác vụ theo lịch trình hiện có (và tất nhiên, kích hoạt lại nó sau khi quá trình phát hành đã hoàn tất thành công). Tôi có thể nhận được một danh sách các nhiệm vụ đã sẵn sàng, đang chạy hoặc bị vô hiệu hóa, nhưng tiếp theo là gì?

Câu trả lời:


14

Bạn có thể sử dụng các đối tượng Scripting Bộ lập lịch tác vụ dựa trên COM :

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

Để kích hoạt lại tác vụ:

$MyTask.Enabled = $true

Ở trên sẽ chỉ hoạt động nếu shell được nâng lên và bạn là Quản trị viên cục bộ trên máy chủ. Bạn có thể tạo lệnh ghép ngắn của riêng bạn với cách trên:

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
Lưu ý: điều này dường như không hoạt động đối với các tác vụ được tạo bằng at.exe. (Ví dụ AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)":). Lỗi bạn sẽ nhận được là 0x80041327; Tác vụ có các thuộc tính không tương thích với các phiên bản trước của windows
Signal15

5

Nếu bạn chỉ đang cố gắng dừng TẤT CẢ các nhiệm vụ, có thể dễ dàng hơn chỉ dừng dịch vụ Lập lịch tác vụ. Mô-đun lên lịch tác vụ không khả dụng cho đến Windows Server 2012, vì vậy việc quản lý các tác vụ không đơn giản như dừng và bắt đầu dịch vụ:

Stop-Service Schedule
Start-Service Schedule

Nếu điều đó không hiệu quả với bạn, scht task.exe vẫn có thể được sử dụng từ PowerShell để quản lý các tác vụ riêng lẻ:

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

1
Từ 2008 / Vista trở đi, Windows tự sử dụng Bộ lập lịch tác vụ rất nhiều cho nhiều tác vụ hệ thống. Tùy thuộc vào thời lượng, việc dừng dịch vụ Lập lịch tác vụ có thể không phải là một ý tưởng tuyệt vời (mặc dù nó rất dễ).
Mathias R. Jessen

Chắc chắn rồi. Trường hợp sử dụng được đưa ra là để vô hiệu hóa các tác vụ trong quá trình bảo trì, do đó có thể là một lựa chọn khả thi. Cũng đưa ra lựa chọn thứ hai trong trường hợp không đáp ứng nhu cầu.
Tim Ferrill


3

Thậm chí là một cách tốt hơn mà bạn không cần chỉ định tên của các nhiệm vụ:

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

0

Đây là hoàn hảo! Nó hoạt động tốt hơn Get-Lên lịchTask kể từ khi tôi ở trong môi trường hỗn hợp 2008/2012. Tôi đã thêm một vài dòng để truy vấn AD và gọi lệnh này đối với một nhóm máy tính. Mục tiêu của tôi là vô hiệu hóa nhiệm vụ "Trình quản lý máy chủ" mở mỗi khi người dùng đăng nhập. Presto! tất cả đi!

$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

Nhìn vào chức năng này

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

}

Ví dụ: bạn có thể vô hiệu hóa tất cả các tác vụ trong thư mục "\ mysql" bằng cách gọi Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Đoạn mã này đến từ Cách vô hiệu hóa / bật tác vụ theo lịch trình theo đợt của PowerShell , bạn có thể tải xuống kho lưu trữ mẫu hoàn chỉnh ở đó.


0

cái này làm việc cho tôi

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.