私は、Windows Server 2008 R2で実行されるWebアプリケーションを持っています。このWebアプリケーションには、すべてのバックエンド関連の処理を行う多数のスケジュールされたタスクがあります。データベースにアクセスするソフトウェア展開を行うとき、スケジュールされたすべてのタスクを無効にする必要があります。現在、私は手動で実行する必要がある長いチェックリストを持っているので、スケジュールされた各タスクを無効にしています。
残念ながら、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
それでもうまくいかない場合でも、PowerShellからschtasks.exeを使用して個々のタスクを管理できます。
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}
これは完璧です!私は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}
}
これは私のために働いた
Get-ScheduledTask -TaskName "TestJob" | Stop-ScheduledTask
この関数を見てください
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
}
}
}
}
たとえば、Control-Tasks -FolderPath "\mysql" -Disable -Recursive
を呼び出すことで、フォルダ「\ mysql」の下のすべてのタスクを無効にすることができます
このコードスニペットは PowerShellによってバッチでスケジュールされたタスクを無効/有効にする方法 から取得されます。完全なサンプルアーカイブをそこからダウンロードできます。