about_Scheduled_Jobs_Troubleshooting
간단한 설명
예약된 작업의 문제를 해결하는 방법을 설명합니다.
자세한 설명
이 문서에서는 PowerShell의 예약된 작업 기능을 사용할 때 발생할 수 있는 몇 가지 문제에 대해 설명하고 이러한 문제에 대한 해결 방법을 제안합니다.
PowerShell 예약된 작업을 사용하기 전에 항목에 대한 about_Scheduled_Jobs 및 관련 예약된 작업을 참조하세요.
PSScheduledJob 모듈에 포함된 cmdlet에 대한 자세한 내용은 PSScheduledJob을 참조하세요.
작업 결과를 찾을 수 없습니다.
PowerShell에서 작업 결과를 가져오기 위한 기본 방법
예약된 작업이 실행되면 예약된 작업의 인스턴스가 만들어집니다. 예약된 작업 인스턴스의 결과를 보고, 관리하고, 얻으려면 작업 cmdlet을 사용합니다.
참고 항목
예약된 작업 인스턴스에서 작업 cmdlet을 사용하려면 PSScheduledJob 모듈을 세션으로 가져와야 합니다. PSScheduledJob 모듈을 가져오려면 예약된 작업 cmdlet(예: Get-ScheduledJob
.)을 입력 Import-Module PSScheduledJob
하거나 사용합니다.
예약된 작업의 모든 인스턴스 목록을 얻으려면 cmdlet을 Get-Job
사용합니다.
Import-Module PSScheduledJob
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed False localhost
44 ProcessJob PSScheduledJob Completed False localhost
45 ProcessJob PSScheduledJob Completed False localhost
46 ProcessJob PSScheduledJob Completed False localhost
47 ProcessJob PSScheduledJob Completed False localhost
48 ProcessJob PSScheduledJob Completed False localhost
49 ProcessJob PSScheduledJob Completed False localhost
50 ProcessJob PSScheduledJob Completed False localhost
cmdlet은 Get-Job
ProcessJob 개체를 파이프라인 아래로 보냅니다. cmdlet은 Format-Table
테이블에 예약된 작업 인스턴스의 이름, ID 및 PSBeginTime 속성을 표시합니다.
Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
Name Id PSBeginTime
---- -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM
예약된 작업의 인스턴스 결과를 얻으려면 cmdlet을 Receive-Job
사용합니다. 다음 명령은 ProcessJob의 최신 인스턴스(ID = 50)의 결과를 가져옵니다.
Receive-Job -ID 50
디스크에서 작업 결과를 찾기 위한 기본 방법
예약된 작업을 관리하려면 작업 cmdlet(예: Get-Job
및 Receive-Job
)을 사용합니다.
작업 인스턴스를 얻지 못하거나 Receive-Job
작업 결과를 얻지 못하는 경우 Get-Job
디스크에서 작업에 대한 실행 기록 파일을 검색할 수 있습니다.
실행 기록에는 트리거된 모든 작업 인스턴스의 레코드가 포함됩니다.
다음 경로에 예약된 작업에 대한 타임스탬프 이름이 지정된 디렉터리가 디렉터리에 있는지 확인합니다.
$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
예시:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
예를 들어 cmdlet은 Get-ChildItem
ProcessJob 예약 작업의 디스크 내 실행 기록을 가져옵니다.
$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output'
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/2/2011 3:00 AM 20111102-030002-260
d---- 11/3/2011 3:00 AM 20111103-030002-277
d---- 11/4/2011 3:00 AM 20111104-030002-209
d---- 11/5/2011 3:00 AM 20111105-030002-251
d---- 11/6/2011 3:00 AM 20111106-030002-174
d---- 11/7/2011 12:00 AM 20111107-000001-914
d---- 11/7/2011 3:00 AM 20111107-030002-376
각 타임스탬프 이름이 지정된 디렉터리가 작업 인스턴스를 나타냅니다. 각 작업 인스턴스의 결과는 타임스탬프 이름이 지정된 디렉터리의 Results.xml 파일에 저장됩니다.
예를 들어 다음 명령은 ProcessJob 예약 작업의 저장된 모든 인스턴스에 대한 Results.xml 파일을 가져옵니다. Results.xml 파일이 없으면 PowerShell에서 작업 결과를 반환하거나 표시할 수 없습니다.
$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output\*\Results.xml'
Get-ChildItem $Path
Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
PSScheduledJob 모듈을 세션으로 가져오지 않아 작업 cmdlet이 예약된 작업 인스턴스 또는 해당 결과를 가져오지 못할 수 있습니다.
참고 항목
예약된 작업 인스턴스에서 작업 cmdlet을 사용하기 전에 PSScheduledJob 모듈이 세션에 포함되어 있는지 확인합니다. PSScheduledJob 모듈이 없으면 작업 cmdlet은 예약된 작업 인스턴스 또는 해당 결과를 가져올 수 없습니다.
PSScheduledJob 모듈을 가져오려면:
Import-Module PSScheduledJob
Receive-Job cmdlet이 이미 결과를 반환했을 수 있습니다.
작업 인스턴스 결과를 반환하지 않는 경우 Receive-Job
Keep 매개 변수 없이 현재 세션에서 해당 작업 인스턴스에 대한 명령이 실행되었기 때문일 Receive-Job
수 있습니다.
Keep 매개 변수 Receive-Job
없이 사용하는 Receive-Job
경우 작업 결과를 반환하고 작업 인스턴스의 HasMoreData 속성을 False로 설정합니다. False 값은 작업의 결과를 반환하고 인스턴스에 반환할 결과가 더 이상 없음을 의미합니다Receive-Job
. 이 설정은 표준 백그라운드 작업에 적합하지만 디스크에 저장되는 예약된 작업의 인스턴스에는 적합하지 않습니다.
작업 인스턴스 결과를 다시 얻으려면 다음을 입력하여 새 PowerShell 세션을 시작합니다 PowerShell
. PSScheduledJob 모듈을 가져오고 명령을 다시 시도합니다Receive-Job
.
Receive-Job -ID 50
#No results
PowerShell.exe
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.
Import-Module PSScheduledJob
Receive-Job -ID 50
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Keep 매개 변수를 사용하여 세션에서 두 번 이상 결과 가져오기
세션에서 작업 인스턴스의 결과를 두 번 이상 얻으려면 cmdlet의 Keep 매개 변수를 Receive-Job
사용합니다.
Import-Module PSScheduledJob
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
예약된 작업이 손상되었을 수 있습니다.
예약된 작업이 손상되면 PowerShell은 손상된 예약된 작업 및 해당 결과를 삭제합니다. 손상된 예약된 작업의 결과를 복구할 수 없습니다.
예약된 작업이 여전히 존재하는지 확인하려면 cmdlet을 Get-ScheduledJob
사용합니다.
Get-ScheduledJob
결과 수가 ExecutionHistoryLength를 초과했을 수 있습니다.
예약된 작업의 ExecutionHistoryLength 속성은 디스크에 저장되는 작업 인스턴스 수와 해당 결과를 결정합니다. 기본값은 32입니다. 예약된 작업의 인스턴스 수가 이 값을 초과하면 PowerShell은 가장 오래된 작업 인스턴스를 삭제하여 각 새 작업 인스턴스에 대한 공간을 만듭니다.
예약된 작업의 ExecutionHistoryLength 속성 값을 얻으려면 다음 명령 형식을 사용합니다.
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
예를 들어 다음 명령은 ProcessJob 예약 작업의 ExecutionHistoryLength 속성 값을 가져옵니다.
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
ExecutionHistoryLength 속성의 값을 설정하거나 변경하려면 and Set-ScheduledJob
cmdlet의 MaxResultCount 매개 변수를 Register-ScheduledJob
사용합니다.
다음 명령은 ExecutionHistoryLength 속성의 값을 50으로 늘입니다 .
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
작업 인스턴스 결과가 삭제되었을 수 있습니다.
cmdlet의 Set-ScheduledJob
ClearExecutionHistory 매개 변수는 작업의 실행 기록을 삭제합니다. 이 기능을 사용하여 디스크 공간을 확보하거나 다른 위치에 필요하지 않거나 이미 사용, 분석 또는 저장된 결과를 삭제할 수 있습니다.
예약된 작업의 실행 기록을 삭제하려면 예약된 작업의 ClearExecutionHistory 매개 변수를 사용합니다.
다음 명령은 ProcessJob 예약 작업의 실행 기록을 삭제합니다.
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
또한 cmdlet은 Remove-Job
작업 결과를 삭제합니다. 예약된 작업을 삭제하는 데 사용하면 Remove-Job
실행 기록 및 모든 작업 결과를 포함하여 디스크에 있는 작업의 모든 인스턴스가 삭제됩니다.
Start-Job cmdlet을 사용하여 시작한 작업은 디스크에 저장되지 않습니다.
예약된 작업을 시작하는 데 작업 Start-Job
트리거 Start-Job
를 사용하는 대신 표준 백그라운드 작업을 시작합니다. 백그라운드 작업 및 해당 결과는 디스크에 있는 작업의 실행 기록에 저장되지 않습니다.
cmdlet을 Get-Job
사용하여 작업 및 Receive-Job
cmdlet을 가져와 작업 결과를 가져올 수 있지만 cmdlet의 Receive-Job
Keep 매개 변수를 사용하지 않는 한 결과를 받을 때까지만 결과를 사용할 수 있습니다.
또한 백그라운드 작업 및 해당 결과는 세션별로 다릅니다. 생성되는 세션에만 존재합니다. 작업을 Remove-Job
삭제하거나 세션을 닫거나 PowerShell을 닫으면 작업 인스턴스와 해당 결과가 삭제됩니다.
예약된 작업이 실행되지 않음
예약된 작업은 작업이 트리거되거나 예약된 작업이 비활성화된 경우 자동으로 실행되지 않습니다.
cmdlet을 Get-ScheduledJob
사용하여 예약된 작업을 가져옵니다. 예약된 작업의 Enabled 속성 값이 True인지 확인합니다.
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
cmdlet을 Get-JobTrigger
사용하여 예약된 작업의 작업 트리거를 가져옵니다.
작업 트리거의 Enabled 속성 값이 True인지 확인합니다.
Get-ScheduledJob ProcessJob | Get-JobTrigger
Id Frequency Time DaysOfWeek Enabled
-- --------- ---- ---------- -------
1 Weekly 11/7/2011 5:00:00 AM {Monday, Thursday} True
2 Daily 11/7/2011 3:00:00 PM True
Get-ScheduledJob ProcessJob|Get-JobTrigger|Format-Table ID, Enabled -Auto
Id Enabled
-- -------
1 True
2 True
작업 트리거가 잘못된 경우 예약된 작업이 자동으로 실행되지 않음
예를 들어 작업 트리거는 과거의 날짜 또는 발생하지 않는 날짜(예: 월의 5번째 월요일)를 지정할 수 있습니다.
작업 트리거 또는 작업 옵션의 조건이 충족되지 않으면 예약된 작업이 자동으로 실행되지 않습니다.
예를 들어 특정 사용자가 컴퓨터에 로그온할 때만 실행되는 예약된 작업은 해당 사용자가 로그온하지 않거나 원격으로만 연결하는 경우 실행되지 않습니다.
예약된 작업의 옵션을 검사하고 충족되는지 확인합니다. 예를 들어 컴퓨터가 유휴 상태이거나 네트워크 연결이 필요하거나 유휴 상태가 길거나 간단한 IdleTimeout이 실행되지 않을 수 있는 예약된 작업입니다.
cmdlet을 Get-ScheduledJobOption
사용하여 작업 옵션 및 해당 값을 검사합니다.
Get-ScheduledJobOption -Name ProcessJob
StartIfOnBatteries : False
StopIfGoingOnBatteries : True
WakeToRun : True
StartIfNotIdle : True
StopIfGoingOffIdle : False
RestartOnIdleResume : False
IdleDuration : 00:10:00
IdleTimeout : 01:00:00
ShowInTaskScheduler : True
RunElevated : False
RunWithoutNetwork : True
DoNotAllowDemandStart : False
MultipleInstancePolicy : IgnoreNew
JobDefinition : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition
예약된 작업 옵션에 대한 설명은 New-ScheduledJobOption을 참조하세요.
예약된 작업 인스턴스가 실패했을 수 있습니다.
예약된 작업 명령이 실패하면 PowerShell에서 오류 메시지를 생성하여 즉시 보고합니다. 그러나 작업 스케줄러가 작업을 실행하려고 할 때 작업이 실패하면 PowerShell에서 오류를 사용할 수 없습니다.
다음 방법을 사용하여 작업 오류를 감지하고 수정합니다.
작업 스케줄러 이벤트 로그에서 오류가 있는지 확인합니다. 로그를 확인하려면 이벤트 뷰어 또는 다음과 같은 PowerShell 명령을 사용합니다.
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
Where {$_.Message -like "fail"}
작업 스케줄러에서 작업 레코드를 확인합니다. PowerShell 예약된 작업은 다음 작업 예약 폴더에 저장됩니다.
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
권한이 부족하여 예약된 작업이 실행되지 않을 수 있습니다.
예약된 작업은 작업을 만든 사용자의 권한 또는 또는 Set-ScheduledJob
명령의 자격 증명 매개 변수 Register-ScheduledJob
로 지정된 사용자의 권한으로 실행됩니다.
해당 사용자에게 명령 또는 스크립트를 실행할 수 있는 권한이 없으면 작업이 실패합니다.
예약된 작업을 가져올 수 없거나 예약된 작업이 손상되었습니다.
드물게 예약된 작업이 손상되거나 해결할 수 없는 내부 모순이 포함될 수 있습니다. 일반적으로 예약된 작업에 대한 XML 파일을 수동으로 편집하면 잘못된 XML이 발생합니다.
예약된 작업이 손상되면 PowerShell은 예약된 작업, 실행 기록 및 디스크에서 결과를 삭제하려고 시도합니다.
예약된 작업을 제거할 수 없는 경우 cmdlet을 실행할 Get-ScheduledJob
때마다 손상된 작업 오류 메시지가 표시됩니다.
손상된 예약된 작업을 제거하려면 다음 방법 중 하나를 사용합니다.
예약된 <ScheduledJobName>
작업의 디렉터리를 삭제합니다. ScheduledJob 디렉터리를 삭제하지 마세요.
디렉터리의 위치:
$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
예시:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.
작업 스케줄러를 사용하여 예약된 작업을 삭제합니다. PowerShell 예약된 작업은 다음 작업 스케줄러 경로에 표시됩니다.
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
작업 cmdlet은 예약된 작업을 일관되게 찾을 수 없습니다.
PSScheduledJob 모듈이 현재 세션에 없는 경우 작업 cmdlet은 예약된 작업을 얻거나 시작하거나 결과를 가져올 수 없습니다.
PSScheduledJob 모듈을 가져오려면 cmdlet과 같은 Get-ScheduledJob
모듈의 cmdlet을 입력 Import-Module PSScheduledJob
하거나 실행하거나 가져옵니다.
PowerShell 3.0부터 모듈에서 cmdlet을 가져오거나 사용할 때 모듈을 자동으로 가져옵니다.
PSScheduledJob 모듈이 현재 세션에 없는 경우 다음 명령 시퀀스를 사용할 수 있습니다.
Get-Job ProcessJob
Get-Job : The command cannot find the job because the job name
ProcessJob was not found.
Verify the value of the Name parameter, and then try the command again.
+ CategoryInfo : ObjectNotFound: (ProcessJob:String) [Get-Job],
PSArgumentException
+ FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
Commands.GetJobCommand
Get-Job
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1} Get-Process True
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed True localhost
44 ProcessJob PSScheduledJob Completed True localhost
45 ProcessJob PSScheduledJob Completed True localhost
46 ProcessJob PSScheduledJob Completed True localhost
47 ProcessJob PSScheduledJob Completed True localhost
48 ProcessJob PSScheduledJob Completed True localhost
49 ProcessJob PSScheduledJob Completed True localhost
50 ProcessJob PSScheduledJob Completed True localhost
이 동작은 명령이 Get-ScheduledJob
PSScheduledJob 모듈을 자동으로 가져온 다음 명령을 실행하기 때문에 발생합니다.
참고 항목
PowerShell