다음을 통해 공유


작업 정보

간단한 설명

PowerShell 백그라운드 작업이 현재 세션과 상호 작용하지 않고 백그라운드에서 명령 또는 식을 실행하는 방법에 대한 정보를 제공합니다.

자세한 설명

이 항목에서는 로컬 컴퓨터의 PowerShell에서 백그라운드 작업을 실행하는 방법을 설명합니다. 원격 컴퓨터에서 백그라운드 작업을 실행하는 방법에 대한 자세한 내용은 about_Remote_Jobs.

백그라운드 작업을 시작하면 작업이 완료되는 데 시간이 연장되더라도 명령 프롬프트가 즉시 반환됩니다. 작업이 실행되는 동안 중단 없이 세션에서 작업을 계속할 수 있습니다.

작업 CMDLET

Cmdlet Description
Start-Job 로컬 컴퓨터에서 백그라운드 작업을 시작합니다.
Get-Job 에서 시작된 백그라운드 작업을 가져옵니다.
현재 세션입니다.
Receive-Job 백그라운드 작업의 결과를 가져옵니다.
Stop-Job 백그라운드 작업을 중지합니다.
Wait-Job 하나 또는 모든 작업이 될 때까지 명령 프롬프트를 표시하지 않습니다.
완료.
Remove-Job 백그라운드 작업을 삭제합니다.
Invoke-Command AsJob 매개 변수는 모든 명령을 백그라운드로 실행합니다.
원격 컴퓨터에서 작업. 또한 매개 변수 없이
Invoke-Command 작업 명령을 원격으로 실행하려면
Start-Job 명령을 포함합니다.

로컬 컴퓨터에서 작업을 시작하는 방법

로컬 컴퓨터에서 백그라운드 작업을 시작하려면 Start-Job cmdlet을 사용합니다.

Start-Job 명령을 작성하려면 작업이 중괄호({ } )로 실행되는 명령을 묶습니다. ScriptBlock 매개 변수를 사용하여 명령을 지정합니다.

다음 명령은 로컬 컴퓨터에서 명령을 실행하는 Get-Process 백그라운드 작업을 시작합니다.

Start-Job -ScriptBlock {Get-Process}

명령은 Start-Job 작업을 나타내는 개체를 반환합니다. 작업 개체에는 작업에 대한 유용한 정보가 포함되어 있지만 작업 결과는 포함되어 있지 않습니다.

작업 개체를 변수에 저장한 다음 다른 Job cmdlet과 함께 사용하여 백그라운드 작업을 관리합니다. 다음 명령은 작업 개체를 시작하고 결과 작업 개체를 $job 변수에 저장합니다.

$job = Start-Job -ScriptBlock {Get-Process}

cmdlet을 Get-Job 사용하여 현재 세션에서 시작된 작업을 나타내는 개체를 가져올 수도 있습니다. Get-Job 는 Start-Job 반환하는 것과 동일한 작업 개체를 반환합니다.

작업 개체 가져오기

현재 세션에서 시작된 백그라운드 작업을 나타내는 개체를 얻으려면 cmdlet을 Get-Job 사용합니다. 매개 변수가 Get-Job 없으면 현재 세션에서 시작된 모든 작업을 반환합니다.

예를 들어 다음 명령은 현재 세션의 작업을 가져옵니다.

PS C:> Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Running    True         localhost  Get-Process

작업 개체를 변수에 저장하고 나중에 명령에서 작업을 나타내는 데 사용할 수도 있습니다. 다음 명령은 ID가 1인 작업을 가져오고 $job 변수에 저장합니다.

$job = Get-Job -Id 1

작업 개체에는 작업이 완료되었는지 여부를 나타내는 작업 상태가 포함됩니다. 완료된 작업에는 "완료됨" 또는 "실패" 상태가 있습니다. 작업이 차단되거나 실행 중일 수도 있습니다.

Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

작업 결과 가져오기

백그라운드 작업을 실행하면 결과가 즉시 표시되지 않습니다. 대신 Start-Job cmdlet은 작업을 나타내는 작업 개체를 반환하지만 결과가 포함되지 않습니다. 백그라운드 작업의 결과를 얻으려면 cmdlet을 Receive-Job 사용합니다.

다음 명령은 cmdlet을 Receive-Job 사용하여 작업의 결과를 가져옵니다. $job 변수에 저장된 작업 개체를 사용하여 작업을 식별합니다.

Receive-Job -Job $job

Receive-Job cmdlet은 작업의 결과를 반환합니다.

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
-------  ------    -----      ----- -----   ------    -- -----------
    103       4    11328       9692    56           1176 audiodg
    804      14    12228      14108   100   101.74  1740 CcmExec
    668       7     2672       6168   104    32.26   488 csrss
# ...

작업 결과를 변수에 저장할 수도 있습니다. 다음 명령은 $job 변수의 작업 결과를 $results 변수에 저장합니다.

$results = Receive-Job -Job $job

또한 리디렉션 연산자(>) 또는 Out-File cmdlet을 사용하여 작업의 결과를 파일에 저장할 수 있습니다. 다음 명령은 리디렉션 연산자를 사용하여 작업 결과를 Results.txt 파일의 $job 변수에 저장합니다.

Receive-Job -Job $job > results.txt

부분 작업 결과 가져오기 및 유지

Receive-Job cmdlet은 백그라운드 작업의 결과를 가져옵니다. 작업이 완료되면 Receive-Job 모든 작업 결과를 가져옵니다. 작업이 계속 실행 중인 경우 Receive-Job 지금까지 생성된 결과를 가져옵니다. 명령을 다시 실행 Receive-Job 하여 나머지 결과를 가져올 수 있습니다.

Receive-Job 기본적으로 결과를 반환하면 작업 결과가 저장되는 캐시에서 해당 결과가 삭제됩니다. 다른 Receive-Job 명령을 실행하면 아직 수신되지 않은 결과만 가져옵니다.

다음 명령은 작업이 완료되기 전에 실행되는 명령의 Receive-Job 결과를 보여 줍니다.

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    68       3     2632        664    29     0.36   1388 ccmsetup
   749      22    21468      19940   203   122.13   3644 communicator
   905       7     2980       2628    34   197.97    424 csrss
  1121      25    28408      32940   174   430.14   3048 explorer

반환된 작업 결과를 삭제하지 않도록 Receive-Job 하려면 Keep 매개 변수를 사용합니다. 따라서 는 Receive-Job 해당 시간까지 생성된 모든 결과를 반환합니다.

다음 명령은 아직 완료되지 않은 작업에 Keep 매개 변수를 사용하는 효과를 보여 줍니다.

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec
     68       3     2632        664    29     0.36   1388 ccmsetup
    749      22    21468      19940   203   122.13   3644 communicator
    905       7     2980       2628    34   197.97    424 csrss
   1121      25    28408      32940   174   430.14   3048 explorer

결과를 기다리는 중

완료하는 데 시간이 오래 걸리는 명령을 실행하는 경우 작업 개체의 속성을 사용하여 작업이 완료된 시기를 확인할 수 있습니다. 다음 명령은 개체를 Get-Job 사용하여 현재 세션의 모든 백그라운드 작업을 가져옵니다.

Get-Job

결과는 테이블에 표시됩니다. 작업의 상태 상태 열에 표시됩니다.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

이 경우 State 속성은 작업 2가 여전히 실행 중임을 표시합니다. cmdlet을 Receive-Job 사용하여 작업 결과를 가져오는 경우 결과가 불완전합니다. cmdlet을 Receive-Job 반복적으로 사용하여 모든 결과를 가져올 수 있습니다. 기본적으로 사용할 때마다 아직 수신되지 않은 결과만 얻을 수 있지만 Receive-Job cmdlet의 Keep 매개 변수를 사용하여 결과를 이미 받았음에도 불구하고 유지할 수 있습니다.

파일에 부분 결과를 쓴 다음, 도착 시 최신 결과를 추가하거나 나중에 작업 상태를 기다렸다가 검사 수 있습니다.

작업이 완료되고 모든 결과를 사용할 수 있게 될 때까지 명령 프롬프트를 반환하지 않는 cmdlet의 Receive-Job Wait 매개 변수를 사용할 수 있습니다.

cmdlet을 Wait-Job 사용하여 작업의 결과 또는 전부를 기다릴 수도 있습니다. Wait-Job 를 사용하면 특정 작업, 모든 작업 또는 작업이 완료될 때까지 기다릴 수 있습니다.

다음 명령은 Wait-Job cmdlet을 사용하여 ID가 10인 작업을 기다립니다.

Wait-Job -ID 10

따라서 작업이 완료될 때까지 PowerShell 프롬프트가 표시되지 않습니다.

미리 결정된 시간 동안 기다릴 수도 있습니다. 이 명령은 Timeout 매개 변수를 사용하여 대기 시간을 120초로 제한합니다. 시간이 만료되면 명령 프롬프트가 반환되지만 작업은 백그라운드에서 계속 실행됩니다.

Wait-Job -ID 10 -Timeout 120

작업 중지

백그라운드 작업을 중지하려면 cmdlet을 Stop-Job 사용합니다. 다음 명령은 시스템 이벤트 로그의 모든 항목을 가져오는 작업을 시작합니다. $job 변수에 작업 개체를 저장합니다.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

다음 명령은 작업을 중지합니다. 파이프라인 연산자(|)를 사용하여 $job 변수 Stop-Job의 작업을 로 보냅니다.

$job | Stop-Job

작업 삭제

백그라운드 작업을 삭제하려면 cmdlet을 Remove-Job 사용합니다. 다음 명령은 $job 변수에서 작업을 삭제합니다.

Remove-Job -Job $job

실패한 작업 조사

작업이 실패한 이유를 확인하려면 작업 개체의 Reason 하위 속성을 사용합니다.

다음 명령은 필요한 자격 증명 없이 작업을 시작합니다. $job 변수에 작업 개체를 저장합니다.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

다음 명령은 Reason 속성을 사용하여 작업이 실패하게 한 오류를 찾습니다.

$job.ChildJobs[0].JobStateInfo.Reason

이 경우 원격 컴퓨터에서 명령을 실행하기 위해 명시적 자격 증명이 필요했기 때문에 작업이 실패했습니다. Reason 속성의 값은 다음과 같습니다.

다음 오류 메시지와 함께 원격 서버에 연결하지 못했습니다. 액세스가 거부되었습니다.

참고 항목

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command