Bagaimana saya bisa menonaktifkan tugas yang dijadwalkan menggunakan Powershell?

8

Saya memiliki aplikasi web yang berjalan di Windows Server 2008 R2, yang memiliki banyak tugas terjadwal yang menangani semua hal backend. Ketika saya melakukan penyebaran perangkat lunak yang menyentuh basis data, saya harus menonaktifkan semua tugas yang dijadwalkan. Saat ini saya memiliki daftar panjang yang harus saya selesaikan secara manual, menonaktifkan setiap tugas yang dijadwalkan saat saya pergi - pasti ini adalah pekerjaan yang matang untuk otomatisasi dengan Powershell.

Sayangnya, dokumentasi Powershell tampaknya cukup tersembunyi tentang bagaimana Anda menonaktifkan tugas terjadwal yang ada (dan tentu saja mengaktifkannya kembali setelah rilis berhasil diselesaikan). Saya bisa mendapatkan daftar tugas siap, berjalan atau dinonaktifkan, tetapi bagaimana selanjutnya?

David Keaveny
sumber

Jawaban:

14

Anda dapat menggunakan objek Skrip Penjadwal Tugas berbasis COM :

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

Untuk mengaktifkan kembali tugas:

$MyTask.Enabled = $true

Di atas hanya akan berfungsi jika shell ditinggikan dan Anda adalah Administrator lokal di server. Anda bisa membuat cmdlet sendiri dengan yang di atas:

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
sumber
2
Catatan: ini tampaknya tidak berfungsi untuk tugas yang dibuat dengan at.exe. (Contoh:) AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)". Kesalahan yang akan Anda dapatkan adalah 0x80041327; Tugas ini memiliki properti yang tidak kompatibel dengan versi windows sebelumnya
Signal15
5

Jika Anda hanya mencoba untuk menghentikan SEMUA tugas, mungkin lebih mudah untuk hanya menghentikan layanan Penjadwal Tugas. Modul ScheduledTasks tidak tersedia hingga Windows Server 2012, jadi mengelola tugas tidak semudah menghentikan dan memulai layanan:

Stop-Service Schedule
Start-Service Schedule

Jika itu tidak berhasil bagi Anda schtasks.exe masih dapat digunakan dari PowerShell untuk mengelola tugas individu:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE
Tim Ferrill
sumber
1
Dari 2008 / Vista dan seterusnya, Windows sendiri menggunakan Penjadwal Tugas untuk berbagai tugas sistem. Tergantung pada durasi, menghentikan layanan Task Scheduler mungkin tidak seperti ide bagus (meskipun adalah mudah).
Mathias R. Jessen
Tentu. Kasus penggunaan yang diberikan adalah untuk menonaktifkan tugas selama pemeliharaan, sehingga bisa menjadi opsi yang layak. Juga berikan opsi kedua jika tidak memenuhi kebutuhan.
Tim Ferrill
3

Bahkan cara yang lebih baik di mana Anda tidak perlu menentukan nama tugas:

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

Ini sempurna! Ini berfungsi lebih baik daripada Get-ScheduledTask karena saya berada di lingkungan campuran 2008/2012. Saya menambahkan beberapa baris ke kueri AD dan menjalankan perintah ini terhadap sekelompok komputer. Tujuan saya adalah menonaktifkan tugas "Server Manager" yang dibuka setiap kali pengguna masuk. Presto! semua hilang!

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

Lihatlah fungsi ini

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

}

Misalnya, Anda dapat menonaktifkan semua tugas di bawah folder "\ mysql" dengan memanggil Control-Tasks -FolderPath "\mysql" -Disable -Recursive

Cuplikan kode ini berasal dari Cara menonaktifkan / mengaktifkan tugas terjadwal dalam batch oleh PowerShell , Anda dapat mengunduh arsip sampel lengkap di sana.

Eric
sumber
0

ini bekerja untuk saya

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
saad elshazly
sumber