Powershellを使用してスケジュールされたタスクを無効にするにはどうすればよいですか?


8

私は、Windows Server 2008 R2で実行されるWebアプリケーションを持っています。このWebアプリケーションには、すべてのバックエンド関連の処理を行う多数のスケジュールされたタスクがあります。データベースにアクセスするソフトウェア展開を行うとき、スケジュールされたすべてのタスクを無効にする必要があります。現在、私は手動で実行する必要がある長いチェックリストを持っているので、スケジュールされた各タスクを無効にしています。

残念ながら、Powershellのドキュメントは、既存のスケジュールされたタスクを無効にする方法についてはかなり恥ずかしいようです(もちろん、リリースが正常に完了したら、再度有効にします)。実行中、実行中、または無効になっているタスクのリストを取得できますが、次はどうしますか?

回答:


14

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
}

2
注:これは、で作成しat.exeたタスクでは機能しないようです。(例:)AT 09:00 /every:SUNDAY shutdown.exe /r /f /d p:4:1 /c "Reboot via SchTask (AT Job)"。表示されるエラーは0x80041327です。タスクに以前のバージョンのウィンドウと互換性のないプロパティがあります
Signal15

5

すべてのタスクを停止するだけの場合は、タスクスケジューラサービスを停止する方が簡単な場合があります。ScheduledTasksモジュールはWindows Server 2012まで利用できないため、タスクの管理はサービスの停止と開始ほど簡単ではありません。

Stop-Service Schedule
Start-Service Schedule

それでも問題が解決しない場合は、PowerShellからschtasks.exeを使用して個々のタスクを管理できます。

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

1
2008 / Vista以降、Windows自体はさまざまなシステムタスクにタスクスケジューラを多用しています。期間によっては、タスクスケジューラサービスを停止することはそれほど簡単なことでありません(簡単ですが)。
Mathias R. Jessen 2014年

承知しました。ここでの使用例は、メンテナンス中にタスクを無効にするためのものであり、実行可能なオプションとなる可能性があります。また、ニーズを満たさない場合に備えて、2番目のオプションを提供しました。
Tim Ferrill、2014年


3

タスクの名前を指定する必要がないより良い方法:

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

0

これは完璧です!私は2008/2012混合環境にいるため、Get-ScheduledTaskよりもうまく機能します。ADにクエリを実行し、コンピューターのグループに対してこのコマンドを呼び出すために数行を追加しました。私の目標は、ユーザーがログインするたびに開く「サーバーマネージャー」のタスクを無効にすることでした。全部なくなった!

$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

この機能を見てください

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でバッチでスケジュールされたタスクを無効/有効にする方法から来ています。サンプルアーカイブをそこからダウンロードできます。


0

これは私のために働いた

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.