如何使用 Powershell 禁用计划任务?

Dav*_*eny 8 automation powershell scheduled-task windows-server-2008-r2

我有一个在 Windows Server 2008 R2 上运行的 Web 应用程序,它有大量的计划任务,负责处理所有后端工作。当我进行涉及数据库的软件部署时,我需要禁用所有计划任务。目前,我有一个很长的清单,我需要手动逐步完成,在执行过程中禁用每个计划任务 - 当然,这是使用 Powershell 实现自动化的成熟工作。

不幸的是,Powershell 文档似乎对如何禁用现有的计划任务(当然,在成功完成发布后重新启用它)的内容相当含糊。我可以获得就绪、正在运行或已禁用任务的列表,但接下来怎么办?

Mat*_*sen 14

您可以使用基于 COM 的任务计划程序脚本对象

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

再次启用任务:

$MyTask.Enabled = $true
Run Code Online (Sandbox Code Playgroud)

以上仅当 shell 被提升并且您是服务器上的本地管理员时才有效。您可以使用上述内容制作自己的 cmdlet:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:这似乎不适用于使用 `at.exe` 创建的任务。(例如:`AT 09:00 /every:SUNDAY shutdown.exe /r /f /dp:4:1 /c "Reboot via SchTask (AT Job)"`)。你会得到的错误是 0x80041327;*该任务具有与以前版本的 Windows 不兼容的属性* (2认同)

Tim*_*ill 5

如果您只是想停止所有任务,则停止任务计划程序服务可能会更容易。ScheduledTasks 模块直到 Windows Server 2012 才可用,因此管理任务不像停止和启动服务那么简单:

Stop-Service Schedule
Start-Service Schedule
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,仍然可以从 PowerShell 使用 schtasks.exe 来管理单个任务:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE
Run Code Online (Sandbox Code Playgroud)