about_Scheduled_Jobs_Troubleshooting

업데이트 날짜: 2014년 5월

적용 대상: Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

항목

about_Scheduled_Jobs_Troubleshooting

간단한 설명

예약된 작업과 관련된 문제 해결 방법에 대해 설명합니다.

자세한 설명

이 섹션에서는 Windows PowerShell®의 예약된 작업 기능을 사용할 때 발생할 수 있는 일부 문제에 대해 설명하고 이들 문제에 대한 해결 방법을 제안합니다.

Windows PowerShell 예약된 작업을 사용하기 전에 about_Scheduled_Jobs 및 항목에 대한 관련 예약된 작업을 참조하세요.

이 항목은 다음 섹션으로 구성됩니다.

  • -- 작업 결과를 찾을 수 없음

  • -- 예약된 작업이 실행되지 않음

  • -- 예약된 작업을 가져올 수 없음: 예약된 작업이 손상됨

  • -- JOB CMDLET이 예약된 작업을 일관성 있게 찾을 수 없음

작업 결과를 찾을 수 없음

  • -- Windows PowerShell에서 작업 결과를 가져오는 기본 방법

    예약된 작업이 실행되면 예약된 작업의 "인스턴스"를 만듭니다. 예약된 작업 인스턴스의 결과를 보고, 관리하고, 가져오려면 Job cmdlet을 사용합니다.

    참고: 예약된 작업의 인스턴스에서 Job cmdlet을 사용하려면 PSScheduledJob 모듈을 세션으로 가져와야 합니다. PSScheduledJob 모듈을 가져오려면 "Import-Module PSScheduledJob"(따옴표 제외)을 입력하거나 Get-ScheduledJob 등의 예약된 Job cmdlet을 사용합니다.

    예약된 작업의 모든 인스턴스 목록을 가져오려면 Get-Job cmdlet을 사용합니다.

               PS C:\> Import-Module PSScheduledJob
               PS C:\> 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
    

    다음 명령은 Format-Table cmdlet을 사용하여 예약된 작업 인스턴스의 Name, ID 및 PSBeginTime 속성을 테이블로 표시합니다.

               PS C:\> 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
    

    예약된 작업의 인스턴스 결과를 가져오려면 Receive-Job cmdlet을 사용합니다. 다음 명령은 가장 새로운 ProcessJob(ID = 50) 인스턴스의 결과를 가져옵니다.

               PS C:\> Receive-Job -ID 50
    
  • -- 디스크에서 작업 결과를 찾는 기본 방법

    예약된 작업을 관리하려면 Get-Job 및 Receive-Job과 같은 Job cmdlet을 사용합니다.

    Get-Job이 작업 인스턴스를 가져오지 않거나 Receive-Job이 작업 결과를 가져오지 않으면 디스크에서 작업에 대한 실행 기록 파일을 검색할 수 없습니다. 실행 기록에는 모든 트리거된 작업 인스턴스의 레코드가 포함됩니다.

    다음 경로에서 예약된 작업에 대한 디렉터리에 타임스탬프로 이름이 지정된 디렉터리가 있는지 확인합니다.

            $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
                 \<ScheduledJobName>\Output
    

    일반적으로:

            C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
              \<ScheduledJobName>\Output
    

    예를 들어 다음 명령은 ProcessJob 예약된 작업의 디스크 실행 기록을 가져옵니다.

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell
                    \ScheduledJobs\ProcessJob\Output
    
            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 파일을 가져옵니다.

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs
                             \ProcessJob\Output\*\Results.xml
    
            Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
                         \ScheduledJobs\ProcessJob\Output
    

    Results.xml 파일이 없으면 Windows PowerShell에서는 작업 결과를 반환하거나 표시할 수 없습니다.

  • -- PSScheduledJob 모듈을 세션으로 가져오지 않으므로 Job cmdlet은 예약된 작업 인스턴스 또는 해당 결과를 가져올 수 없습니다.

    참고: 예약된 작업 인스턴스에서 Job cmdlet을 사용하기 전에 PSScheduledJob 모듈이 세션이 포함되어 있는지 확인합니다. 모듈이 없으면 Job cmdlet은 예약된 작업 인스턴스 또는 해당 결과를 가져올 수 없습니다.

    PSScheduledJob 모듈을 가져오려면 다음을 입력합니다.

               Import-Module PSScheduledJob
    
  • -- Receive-Job cmdlet이 현재 세션에서 이미 결과를 반환했을 수 있습니다.

    Receive-Job이 작업 인스턴스 결과를 반환하지 않으면 이는 해당 작업 인스턴스에 대한 Receive-Job 명령이 Keep 매개 변수 없이 현재 세션에서 실행되었기 때문일 수 있습니다.

    Receive-Job을 Keep 매개 변수 없이 사용하면 Receive-Job은 작업 결과를 반환하고 작업 인스턴스의 HasMoreData 속성을 False로 설정하여 작업 인스턴스에 대한 모든 결과를 반환했고 반환할 추가 결과가 없음을 나타냅니다. 이 설정은 표준 백그라운드 작업에는 적절하지만 디스크에 저장되는 예약된 작업 인스턴스에는 적절하지 않습니다.

    작업 인스턴스 결과를 다시 가져오려면 새 Windows PowerShell 세션을 시작하고(따옴표 없이 "PowerShell" 입력), PSScheduledJob 모듈을 가져오고, Receive-Job 명령을 다시 시도합니다.

               PS C:\> Receive-Job -ID 50
               PS C:\>                     #No results
               PS C:\> PowerShell
    
               Windows PowerShell
               Copyright (C) 2012 Microsoft Corporation. All rights reserved.
    
               PS C:\> Import-Module PSScheduledJob
               PS C:\> 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
               ...
    

    한 세션에서 작업 인스턴스 결과를 두 번 이상 가져오려면 Receive-Job cmdlet의 Keep 매개 변수를 사용합니다.

               PS C:\> Import-Module PSScheduledJob
               PS C:\> 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
    
    
               PS C:\> 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
    
  • -- 예약된 작업이 손상되었을 수 있습니다.

    예약된 작업이 손상되면 Windows PowerShell에서는 손상된 예약된 작업 및 해당 결과를 삭제합니다. 손상된 예약된 작업의 결과는 복구할 수 없습니다.

    예약된 작업이 있는지 확인하려면 Get-ScheduledJob cmdlet을 사용합니다.

               PS C:\> Get-ScheduledJob   
    
  • -- 결과 수가 예약된 작업의 ExecutionHistoryLength를 초과했을 수 있습니다.

    예약된 작업의 ExecutionHistoryLength는 디스크에 저장되는 작업 인스턴스 및 해당 결과 수를 결정합니다. 기본값은 32입니다. 예약된 작업의 인스턴스 수가 이 값을 초과하면 Windows PowerShell에서는 가장 오래된 작업 인스턴스를 삭제하여 각 새 작업 인스턴스에 사용할 공간을 만듭니다.

    예약된 작업의 ExecutionHistoryLength 속성 값을 가져오려면 다음 명령 형식을 사용합니다.

               (Get-ScheduledJob <JobName>).ExecutionHistoryLength
    

    예를 들어 다음 명령은 ProcessJob 예약된 작업의 ExecutionHistoryLength 속성 값을 가져옵니다.

               PS C:\> (Get-ScheduledJob ProcessJob).ExecutionHistoryLength
    

    ExecutionHistoryLength 속성 값을 설정하거나 변경하려면 Register-ScheduledJob 및 Set-ScheduledJob cmdlet의 MaxResultCount 매개 변수를 사용합니다.

    다음 명령은 ExecutionHistoryLength 속성 값을 50으로 늘립니다.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
    
  • -- 작업 인스턴스 결과가 삭제되었을 수 있습니다.

    Set-ScheduledJob cmdlet의 ClearExecutionHistory 매개 변수는 작업 실행 기록을 삭제합니다. 이 기능을 사용하여 디스크 공간을 확보하거나 필요하지 않거나 다른 위치에서 이미 사용, 분석 또는 저장된 결과를 삭제합니다.

    예약된 작업의 실행 기록을 삭제하려면 예약된 작업의 ClearExecutionHistory 매개 변수를 사용합니다.

    다음 명령은 ProcessJob 예약된 작업의 실행 기록을 삭제합니다.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
    

    또한 Remove-Job cmdlet은 작업 결과를 삭제합니다. Remove-Job을 사용하여 예약된 작업을 삭제하면 실행 기록 및 모든 작업 결과를 포함하여 디스크에 있는 모든 작업 인스턴스가 삭제됩니다.

  • -- Start-Job cmdlet을 사용하여 시작한 작업이 디스크에 저장되지 않습니다.

    작업 트리거 대신 Start-Job을 사용하여 예약된 작업을 시작하면 Start-Job이 표준 백그라운드 작업을 시작하지 않습니다. 백그라운드 작업 및 해당 결과가 디스크의 작업 실행 기록에 저장되지 않습니다.

    Get-Job cmdlet을 사용하여 작업을 가져오고 Receive-Job cmdlet을 사용하여 작업 결과를 가져올 수 있지만, Receive-Job cmdlet의 Keep 매개 변수를 사용하지 않으면 결과는 해당 결과를 받을 때까지만 사용할 수 있습니다.

    또한 백그라운드 작업과 해당 결과는 세션에 특정합니다. 만들어진 세션에서만 존재합니다. 작업을 삭제하고(Remove-Job) 세션을 닫거나 Windows PowerShell을 닫으면 작업 인스턴스 및 결과가 삭제됩니다.

예약된 작업이 실행되지 않음

  • -- 작업 트리거나 예약된 작업을 사용하지 않도록 설정하면 예약된 작업이 자동으로 실행되지 않습니다.

    Get-ScheduledJob cmdlet을 사용하여 예약된 작업을 가져옵니다. 예약된 작업의 Enabled 속성 값이 True($true)인지 확인합니다.

        PS C:\> Get-ScheduledJob ProcessJob
    
        Id         Name            Triggers        Command         Enabled
        --         ----            --------        -------         -------
        4          ProcessJob      {1, 2}          Get-Process     True
    
    
        PS C:\> (Get-ScheduledJob ProcessJob).Enabled
        True
    

    Get-JobTrigger cmdlet을 사용하여 예약된 작업의 작업 트리거를 가져옵니다. 작업 트리거의 Enabled 속성 값이 True($true)인지 확인합니다.

        PS C:\> 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
    
    
        PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger | Format-Table ID, Enabled -Auto
    
        Id Enabled
        -- -------
        1    True
        2    True
    
  • -- 작업 트리거가 유효하지 않으면 예약된 작업이 자동으로 실행되지 않습니다.

    예를 들어 작업 트리거가 해당 월의 5번째 월요일과 같이 발생하지 않은 날짜나 과거 날짜를 지정할 수 있습니다.

  • -- 작업 트리거 조건이나 작업 옵션을 충족하지 않으면 예약된 작업이 자동으로 실행되지 않습니다.

    예를 들어 특정 사용자가 컴퓨터에 로그온할 때만 실행되는 예약된 작업이 해당 사용자가 로그온하지 않거나 원격으로만 연결하면 실행되지 않습니다.

    예약된 작업의 옵션을 검토하고 옵션이 충족되는지 확인합니다. 예를 들어 컴퓨터가 유휴 상태여야 하거나, 네트워크 연결이 필요하거나 긴 IdleDuration 및 짧은 IdleTimeout이 포함된 예약된 작업은 실행되지 않을 수 있습니다.

    Get-ScheduledJobOption cmdlet을 사용하여 작업 옵션과 해당 값을 검토합니다.

           PS C:\> Get-ScheduledJob -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 cmdlet(https://go.microsoft.com/fwlink/?LinkID=223919)(영문)에 대한 도움말 항목을 참조하세요.

  • -- 예약된 작업 인스턴스가 실패했을 수 있습니다.

    예약된 작업 명령이 실패하면 Windows PowerShell에서는 즉시 오류 메시지를 생성하여 실패를 보고합니다. 그러나 작업 스케줄러가 실행하려고 할 때 작업이 실패한 경우 Windows PowerShell에서 오류를 사용할 수 없습니다.

    다음 방법을 사용하여 작업 실패를 검색하고 수정합니다.

    • -- 작업 스케줄러 이벤트 로그에서 오류를 확인합니다. 로그를 확인하려면 이벤트 뷰어를 사용하거나 다음과 같은 Windows PowerShell 명령을 사용합니다.

              Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational | Where {$_.Message -like "*fail*"}
      
    • 작업 스케줄러에서 작업 레코드를 확인하려면 Windows PowerShell 예약된 작업이 다음 작업 예약 폴더에 저장되었는지 확인합니다.

              Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
      
  • -- 권한이 없어서 예약된 작업이 실행되지 않을 수 있습니다.

    예약된 작업은 작업을 만든 사용자의 권한이나 Register-ScheduledJob 또는 Set-ScheduledJob 명령에서 Credential 매개 변수로 지정된 사용자의 권한으로 실행됩니다.

    해당 사용자에게 명령이나 스크립트를 실행할 권한이 없으면 작업이 실패합니다.

예약된 작업을 가져올 수 없음: 예약된 작업이 손상됨

드물지만 예약된 작업이 손상되거나 해결할 수 없는 내부 모순을 포함할 수 있습니다. 일반적으로 이 문제는 예약된 작업의 XML 파일을 수동으로 편집할 때 발생하여 XML이 유효하지 않게 됩니다.

예약된 작업이 손상되면 Windows PowerShell에서는 예약된 작업, 실행 기록 및 결과를 디스크에서 삭제하려고 합니다.

예약된 작업을 제거할 수 없으면 Get-ScheduledJob cmdlet을 실행할 때마다 손상된 작업 오류 메시지가 표시됩니다.

손상된 예약된 작업을 제거하려면 다음 방법의 하나를 사용합니다. 여기에 섹션 본문을 삽입합니다.

  • -- 예약된 작업에 대한 <ScheduledJobName> 디렉터리를 삭제합니다. ScheduledJob 디렉터리는 삭제하지 마세요.

    디렉터리는 $env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>에 있습니다.

    일반적으로:

           C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell
             \ScheduledJobs\<ScheduledJobName>.
    
  • -- 작업 스케줄러를 사용하여 예약된 작업을 삭제합니다. Windows PowerShell 예약된 작업은 다음 작업 스케줄러 경로에 나타납니다.

           Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>
    

JOB CMDLET이 예약된 작업을 일관성 있게 찾을 수 없음

PSScheduledJob 모듈이 현재 세션에 없으면 Job cmdlets은 예약된 작업을 가져와서 시작하거나 해당 결과를 가져올 수 없습니다.

PSScheduledJob 모듈을 가져오려면 "Import-Module PSScheduledJob"을 입력하거나 모듈에서 Get-ScheduledJob cmdlet 등의 cmdlet을 실행하거나 가져옵니다. Windows PowerShell 3.0부터 모듈에서 cmdlet을 가져오거나 사용할 때 모듈을 자동으로 가져옵니다.

PSScheduledJob cmdlet이 현재 세션에 없으면 다음 명령 시퀀스가 가능합니다.

            PS C:\> 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

            PS C:\> Get-Job
            PS C:\> Get-ScheduledJob ProcessJob

            Id         Name            Triggers        Command      Enabled
            --         ----            --------        -------      -------
            4          ProcessJob      {1}             Get-Process  True

            PS C:\> 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 모듈을 자동으로 가져오고 명령을 실행하기 때문에 발생합니다.

참고 항목

about_Scheduled_Jobs

about_Scheduled_Jobs_Basics

about_Scheduled_Jobs_Advanced