HOWTO · PowerShell

PowerShell에서 Start-Process의 종료 코드 가져오는 방법

이 기사에서는 start-process cmdlet로 스크립트를 실행한 후 종료 코드를 얻는 방법을 설명합니다.

이 페이지의 내용

PowerShell Start-Process로 시작한 프로세스의 종료 코드를 얻으려면 -PassThru로 프로세스 개체를 받고, -Wait로 프로세스가 끝날 때까지 기다리세요. 그런 다음 ExitCode 속성을 읽으면 됩니다:

$pwshPath = (Get-Process -Id $PID).Path
$workingDirectory = [System.IO.Path]::GetTempPath()
$process = Start-Process -FilePath $pwshPath -ArgumentList @('-NoProfile', '-Command', 'exit 7') -WorkingDirectory $workingDirectory -Wait -PassThru
"Exit code: $($process.ExitCode)"
Exit code: 7

이 예제는 현재 PowerShell 실행 파일을 임시 작업 디렉터리에서 시작하고, 자식 프로세스가 종료 코드 7을 반환하도록 합니다. 현재 실행 파일을 사용하므로 cmd.exe 같은 Windows 전용 프로그램에 의존하지 않으며, 작업 디렉터리를 명시해 호출자의 현재 디렉터리에도 의존하지 않습니다. 실행할 프로그램에 맞게 실행 파일과 인수를 바꾸세요. -Wait는 프로세스가 끝날 때까지 PowerShell이 기다리게 하고, -PassThru는 ExitCode를 읽을 수 있도록 프로세스 개체를 반환합니다. 제공된 실행 결과에는 Exit code: 7이 표시됩니다. 바이트가 동일하게 유지되는 예제의 레이블은 영어입니다. 종료 코드 0은 일반적으로 성공을 뜻하지만, 0이 아닌 값의 의미는 프로그램마다 다릅니다.

-Wait와 -PassThru로 종료 코드 가져오기

스크립트의 다음 단계가 실행한 프로그램의 결과에 따라 달라진다면 두 매개 변수를 함께 사용하세요. -Wait는 PowerShell이 언제 다음 단계로 진행할지를 제어하고, -PassThru는 프로세스 개체를 반환합니다. 프로세스가 끝난 뒤 ExitCode를 읽으면 최종 결과를 얻을 수 있습니다.

$process.ExitCode를 $exitCode에 저장하고, 스크립트가 다음에 무엇을 할지 결정하기 전에 값을 0과 비교하세요. 조건은 프로그램에 문서화된 종료 코드에 맞게 조정하면 됩니다. 0이 아닌 값이 모두 같은 뜻인 것은 아닙니다. 오류를 나타낼 수도 있고, 프로그램에서 정의한 다른 결과를 나타낼 수도 있습니다.

$LastExitCode가 Start-Process의 종료 코드를 보고하지 않는 이유

Start-Process는 $LastExitCode를 설정하지 않습니다. 이 변수는 현재 PowerShell 세션에서 직접 실행한 네이티브 프로그램 중 가장 최근에 실행된 프로그램의 종료 코드를 담습니다. Start-Process로 별도 프로세스를 시작해도 해당 프로세스의 종료 코드를 $LastExitCode로 가져올 수는 없습니다.

대신 Start-Process -PassThru가 반환한 프로세스 개체의 ExitCode 속성을 사용하세요. 네이티브 프로그램을 직접 실행하면 그 프로그램이 끝날 때 PowerShell이 $LastExitCode를 갱신합니다. 이는 별도의 실행 방식이며, Start-Process로 시작한 프로세스의 결과를 가져오지는 않습니다.

WaitForExit()로 프로세스 개체에서 종료 코드 가져오기

-Wait를 생략하고 프로세스 개체를 보관한 다음, ExitCode를 읽기 전에 개체의 WaitForExit() 메서드를 호출할 수도 있습니다. 기다리기 전에 다른 작업을 해야 할 때 유용합니다. 이 메서드는 해당 프로세스가 종료될 때까지 실행을 멈춥니다.

같은 작업을 순서대로 수행하려면 -PassThru로 프로세스를 시작하고, WaitForExit()를 호출한 다음, $process.ExitCode를 읽으면 됩니다. 결과를 확인하려는 프로세스에 연결된 개체를 보관하세요. 이 방식에서는 $LastExitCode를 사용하지 않습니다. 패킷에 이 대안의 실행 증거가 없으므로 별도의 출력 결과는 제시하지 않습니다.

결론

Start-Process로 시작한 프로세스의 종료 코드를 확인하려면 -PassThru와 -Wait를 함께 사용하고 반환된 개체의 ExitCode 속성을 읽으세요. 또는 해당 개체에서 WaitForExit()를 호출한 뒤 속성을 읽을 수 있습니다. $LastExitCode는 PowerShell에서 직접 실행한 네이티브 프로그램에 적용되며, Start-Process로 시작한 프로세스에는 적용되지 않습니다.