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