Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

대부분의 사용자와 관리자는 taskschd.msc 그래픽 콘솔(작업 스케줄러)을 사용해 Windows에서 예약 작업을 만들고 관리합니다. 하지만 스크립트나 자동화 프로세스를 구성할 때는 GUI보다 PowerShell 기능을 활용하는 것이 훨씬 편리합니다. 이 글에서는 PowerShell을 사용하여 Windows 작업 스케줄러의 예약 작업을 생성하고 관리하는 방법을 소개합니다.

PowerShell로 Windows 예약 작업 관리하기

Windows 10 및 Windows Server 2016 이상에서는 ScheduledTasks PowerShell 모듈을 사용해 예약 작업을 관리할 수 있습니다. 모듈에 포함된 cmdlet 목록은 다음 명령으로 확인할 수 있습니다.

Get-Command -Module ScheduledTasks

  • Disable-ScheduledTask
  • Enable-ScheduledTask
  • Export-ScheduledTask
  • Get-ClusteredScheduledTask
  • Get-ScheduledTask
  • Get-ScheduledTaskInfo
  • New-ScheduledTask
  • New-ScheduledTaskAction
  • New-ScheduledTaskPrincipal
  • New-ScheduledTaskSettingsSet
  • New-ScheduledTaskTrigger
  • Register-ClusteredScheduledTask
  • Register-ScheduledTask
  • Set-ClusteredScheduledTask
  • Set-ScheduledTask
  • Start-ScheduledTask
  • Stop-ScheduledTask
  • Unregister-ClusteredScheduledTask
  • Unregister-ScheduledTask

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

참고: 과거에는 Windows에 내장된 콘솔 도구인 schtasks.exe를 사용해 스케줄러 작업을 만들고 관리했습니다.

PowerShell로 예약 작업 생성하기

PowerShell 3.0(Windows Server 2012 / Windows 8)부터는 New-ScheduledTaskTriggerRegister-ScheduledTask cmdlet을 사용해 간단히 예약 작업을 만들 수 있습니다.

예를 들어, 시스템 시작 시 또는 특정 시간에 PowerShell 스크립트나 명령을 실행하는 예약 작업이 필요하다고 가정해 보겠습니다. 매일 오전 10시에 C:\PS\StartupScript.ps1 파일을 실행하는 StartupScript1이라는 이름의 작업을 만들어 보겠습니다. 이 작업은 SYSTEM 계정으로 실행되며, 높은 권한으로 실행(“Run with highest privileges”) 옵션이 적용됩니다.

$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

작업이 성공적으로 생성되면 상태가 “준비됨(Ready)”으로 표시됩니다.

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

이제 지정한 일정에 따라 PowerShell 스크립트가 실행됩니다. 컴퓨터에 PS1 스크립트 실행을 차단하는 PowerShell 실행 정책(Execution Policy)이 설정되어 있다면, 예약 작업에서 -Bypass 매개변수를 사용해 스크립트를 실행할 수 있습니다.

새 작업을 만들 때 아래 코드를 사용하세요.

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"

팁: 컴퓨터가 시작될 때마다 작업을 실행하려면 첫 번째 명령을 다음과 같이 변경합니다.
$Trigger= New-ScheduledTaskTrigger -AtStartup
사용자가 로그온할 때 작업을 실행하려면 다음과 같이 설정합니다.
$Trigger= New-ScheduledTaskTrigger -AtLogon

taskschd.msc 콘솔을 열어 작업 스케줄러 라이브러리에 새 작업이 등록되었는지 확인할 수 있습니다.

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

PowerShell 2.0(Windows 7, Windows Server 2008 R2) 환경이라면 Schedule.Service COM 인터페이스를 사용하거나 PowerShell 버전을 업그레이드해야 합니다. 다음은 시스템 시작 시 특정 PowerShell 스크립트 파일을 실행하는 예약 작업을 COM 객체로 생성하는 예제입니다. 작업은 NT AUTHORITY\SYSTEM 권한으로 수행됩니다.

$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#https://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)

PowerShell로 예약 작업 조회 및 실행하기

Windows에서 활성화된 모든 예약 작업 목록은 다음 명령으로 확인할 수 있습니다.

Get-ScheduledTask -TaskPath | ? state -ne Disabled

특정 작업에 대한 상세 정보를 가져오려면 다음과 같이 입력합니다.

Get-ScheduledTask CheckServiceState| Get-ScheduledTaskInfo

LastRunTime : 4/7/2021 10:00:00 AM
LastTaskResult : 267011
NextRunTime : 4/8/2021 10:00:00 AM
NumberOfMissedRuns : 0
TaskName : CheckServiceState
TaskPath : \
PSComputerName :

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

작업을 비활성화하려면 다음 명령을 사용합니다.

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

작업을 다시 활성화하려면 다음과 같이 합니다.

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

일정을 기다리지 않고 즉시 작업을 실행하려면 다음 명령을 사용합니다.

Start-ScheduledTask CheckServiceState

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

작업 스케줄러 라이브러리에서 작업을 완전히 삭제하려면 다음과 같이 입력합니다.

Unregister-ScheduledTask -TaskName CheckServiceState

작업을 실행하는 사용자 계정을 변경하거나 호환성 모드를 조정해야 하는 경우 Set-ScheduledTask cmdlet을 사용합니다.

$task_user = New-ScheduledTaskPrincipal -UserId woshub\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings

만약 “Set-ScheduledTask: 계정 이름과 보안 ID 간의 매핑이 수행되지 않았습니다(No mapping between account names and security IDs was done)”라는 오류가 발생하면, 입력한 사용자 이름이 올바른지 먼저 확인하세요.

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

XML 파일로 예약 작업 내보내기 및 가져오기

PowerShell을 사용하면 예약 작업의 현재 설정을 XML 텍스트 파일로 내보낼 수 있습니다. 이렇게 하면 작업 설정을 백업하거나 다른 컴퓨터에 동일한 작업을 배포할 수 있습니다. 작업 내보내기는 작업 스케줄러 GUI와 PowerShell 콘솔 어디에서든 가능합니다.

다음은 StartupScript라는 이름의 작업을 StartupScript.xml 파일로 내보내는 명령입니다.

Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml

PowerShell로 Windows 예약 작업 만들기 및 관리하는 방법

Export-ScheduledTask cmdlet은 PowerShell 2.0에서는 제공되지 않습니다. 따라서 Windows 7 / Windows Server 2008 R2 환경에서는 내장 도구인 schtasks를 사용해 작업 설정을 내보내고 결과를 텍스트 파일로 저장하는 것이 좋습니다.

schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"

XML 파일로 내보낸 예약 작업 설정은 GUI, SchTasks.exe 또는 PowerShell을 통해 네트워크상의 어떤 컴퓨터로든 가져올 수 있습니다.

Register-ScheduledTask cmdlet을 사용하면 XML 파일에서 작업 설정을 읽어 등록할 수 있습니다.
Register-ScheduledTask -Xml (Get-Content "\\mun-fs01\public\NewPsTask.xml" | out-string) -TaskName "NewPsTask"
PowerShell 2.0(Windows 7 / Server 2008 R2)에서는 schtasks 도구를 사용해 작업을 가져오는 것이 더 간편합니다. 첫 번째 명령은 새 작업을 생성하고, 두 번째 명령은 트리거를 기다리지 않고 즉시 작업을 실행합니다.

schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"

주의할 점은, 이 예제에서는 작업을 실행하는 데 사용되는 계정의 자격 증명을 지정했다는 것입니다. 자격 증명을 지정하지 않으면 해당 정보가 작업에 저장되어 있지 않기 때문에 가져오기 과정에서 직접 입력하라는 메시지가 표시됩니다.