Powershell을 사용하여 예약 된 작업을 비활성화하려면 어떻게합니까? 드리는 소프트웨어

Windows Server 2008 R2에서 실행되는 웹 응용 프로그램이 있습니다.이 응용 프로그램에는 모든 백엔드 작업을 처리하는 많은 예약 된 작업이 있습니다. 데이터베이스를 건 드리는 소프트웨어 배포를 수행 할 때 예약 된 모든 작업을 비활성화해야합니다. 현재 필자는 수동으로 단계별로 수행해야하는 긴 점검 목록을 가지고 있으며 예정된 각 작업을 비활성화합니다. Powershell을 사용하면 자동화 작업이 완료됩니다.

불행히도 Powershell 설명서는 기존의 예약 된 작업을 비활성화하는 방법 (물론 릴리스가 성공적으로 완료된 후 다시 활성화하는 방법)에 대해 상당히 아쉬운 것 같습니다. 준비, 실행 또는 비활성화 된 작업 목록을 얻을 수 있지만 다음은 무엇입니까?



답변

COM 기반 작업 스케줄러 스크립팅 개체를 사용할 수 있습니다 .

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

작업을 다시 활성화하려면

$MyTask.Enabled = $true

위의 내용은 쉘이 상승하고 서버의 로컬 관리자 인 경우에만 작동합니다. 위와 같이 자신 만의 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
}

답변

모든 작업을 중지하려는 경우 작업 스케줄러 서비스를 중지하는 것이 더 쉬울 수 있습니다. ScheduledTasks 모듈은 Windows Server 2012까지 사용할 수 없으므로 작업 관리는 서비스를 중지하고 시작하는 것만 큼 간단하지 않습니다.

Stop-Service Schedule
Start-Service Schedule

그래도 작동하지 않으면 schtasks.exe를 PowerShell에서 계속 사용하여 개별 작업을 관리 할 수 ​​있습니다.

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를 쿼리하고 컴퓨터 그룹에 대해이 명령을 호출하기 위해 몇 줄을 추가했습니다. 내 목표는 사용자가 로그인 할 때마다 “서버 관리자”작업을 비활성화하는 것이 었습니다. Presto! 다 갔다!

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

답변

이 기능을 봐

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에서 예약 된 작업을 일괄 적으로 비활성화 / 활성화하는 방법에서 제공되며 전체 샘플 아카이브를 다운로드 할 수 있습니다.


답변

이것은 나를 위해 일했다

    Get-ScheduledTask -TaskName "TestJob"  | Stop-ScheduledTask