PowerShell에서 스크립트 종료


394

함수 내에서 복구 할 수없는 오류가 발생할 때 PowerShell (PS1) 스크립트를 종료하는 방법을 찾고있었습니다. 예를 들면 다음과 같습니다.

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

물론과 같은 것은 없습니다 $host.Exit(). 이 $host.SetShouldExit()있지만 실제로 콘솔 창을 닫습니다. 원하는 것은 아닙니다. 내가 필요한 것은 sys.exit()추가 스크립트없이 현재 스크립트의 실행을 중단하는 Python과 동등한 것입니다.

편집 : 네, 그냥 exit있습니다. 어.


8
필자의 경우 PowerShell 창 또는 ISE를 닫지 않으려면 대신 "return"을 사용하십시오. 현재 실행중인 컨텍스트를 종료합니다. "새로운 사람"은 교육 목적을위한 모든 옵션을 철저히 설명합니다. 향후 StackOverflow 사용자를 위해 승인 된 답변을 변경하는 것이 좋습니다 (현재 더 많은 투표권이 있음). 스크립트를 디버깅 할 수도 있습니다.
ZaxLofful

이것이 귀하의 질문에 대답합니까? PowerShell에서 "종료"란 정확히 무엇입니까?
Mark Schultheiss

답변:


389

키워드를 사용해야 합니다exit .


15
이런 헛소리, 내가 이런 일을 영리하게 수행하는 방법을 알아 내려고 노력하지 않았다면 아마도 시작하여 작동하는 것으로 생각했을 것입니다 :) 감사합니다.
kprobst

118
이것이 어떻게 받아 들여지는 답입니까? 이 질문은 "콘솔 창을 닫습니다"라는 질문을했습니다.
claudekennilol 2014 년

3
@claudekennilol 질문자 만이 답변을 수락 할 수 있습니다. 그들은 출구가 창문을 닫아야한다는 사실을 놓쳤거나, 마음을 바꾸고 그것을 목적에 맞는 것으로 간주했습니다.
Iszi

3
v3 또는 v4에서 콘솔 창을 닫지 않습니다. 글쎄, 탐색기에서 스크립트를 실행하면 스크립트가 어떻게 종료 되더라도 그렇게 할 것입니다. PowerShell 명령 창에서 실행중인 경우 창을 닫지 않습니다.
Joshua Nurczyk

14
New Guy의 답변은 훨씬 철저하고 디버는 허용 된 것으로 표시됩니다.
Jim Aho

585

나는 이것이 오래된 게시물이라는 것을 알고 있지만이 주제를 검색 할 때 최고의 검색 결과 중 하나이기 때문에이 스레드로 돌아 오는 것을 많이 발견합니다. 그러나 나는 상충되는 정보로 인해 항상 혼란스러워합니다. 궁극적으로 나는 항상 알아 내기 위해 자체 테스트를 수행해야합니다. 이번에는 결과를 게시하겠습니다.

TL; DR 대부분의 사람들은 Exit실행중인 스크립트를 종료하는 데 사용하려고합니다 . 그러나 스크립트가 나중에 쉘에서 사용할 함수를 선언하는 경우 해당 함수 Return의 정의에 사용하려고 합니다.

이탈 vs 리턴 vs 휴식

  • 종료 : 현재 실행중인 컨텍스트를 "종료"합니다. 스크립트에서이 명령을 호출하면 스크립트가 종료됩니다. 쉘에서이 명령을 호출하면 쉘이 종료됩니다.

    함수가 종료 명령을 호출하면 실행중인 컨텍스트를 종료합니다. 따라서 해당 함수가 실행중인 스크립트 내에서만 호출되면 해당 스크립트를 종료합니다. 그러나 스크립트가 현재 셸에서 사용할 수 있도록 함수를 선언하고 셸에서 해당 기능을 실행하는 경우 셸은 Exit명령을 수행 하는 함수의 컨텍스트이므로 셸이 종료 됩니다.

    참고 : 기본적으로 PowerShell에서 스크립트를 실행하기 위해 마우스 오른쪽 버튼을 클릭하면 스크립트 실행이 완료되면 PowerShell이 ​​자동으로 닫힙니다. 이것은 Exit명령이나 스크립트의 다른 것과 관련이 없습니다. 이 특정 스크립트 실행 방법을 사용하여 스크립트를 실행하는 것은 기본 PowerShell 동작입니다. 배치 파일과 명령 줄 창에서도 마찬가지입니다.

  • 반환 : 이전 호출 지점으로 돌아갑니다. 스크립트에서 (함수 밖에서)이 명령을 호출하면 쉘로 돌아갑니다. 셸에서이 명령을 호출하면 셸 (쉘에서 실행 된 단일 명령의 이전 호출 지점)로 돌아갑니다. 함수에서이 명령을 호출하면 함수가 호출 된 곳으로 돌아갑니다.

    호출 지점 이후에 명령을 실행하면 해당 지점부터 계속됩니다. 스크립트가 쉘에서 호출되고 Return함수 외부 에 명령 이 포함되어 있으면 쉘로 돌아갈 때 더 이상 실행할 명령 Return이 없으므로이 방법으로 기본적으로와 동일하게 사용됩니다 Exit.

  • 중단 : 루프 및 스위치 케이스가 중단됩니다. 루프 또는 스위치 케이스가 아닌 상태에서이 명령을 호출하면 스크립트에서 벗어날 수 있습니다. Break루프 내부에 중첩 된 루프 내부 를 호출하면 호출 된 루프에서만 끊어집니다.

    Break레이블 앞에 루프에 접두사를 붙일 수 있는 흥미로운 기능이 있으며, 레이블이 지정된 루프 Break내에서 여러 중첩 그룹 내에서 명령을 호출 하더라도 레이블이 지정된 루프에서 벗어날 수 있습니다 .

    While ($true) {
        # Code here will run
    
        :myLabel While ($true) {
            # Code here will run
    
            While ($true) {
                # Code here will run
    
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
    
                # Code here will not run
            }
    
            # Code here will not run
        }
    
        # Code here will run
    }

39
또한 Exit반환 코드를 매개 변수로 사용할 수 있습니다 (기본값은 0) Exit 3.
aucuparia

2
나는 이것이 훨씬 더 나은 대답이라는 데 동의합니다. "브레이크"는 의도하지 않은 결과를 초래할 수 있습니다.
iagomartinez

"종료"에 대한 귀하의 의견이 완전히 올바른지 잘 모르겠습니다. Exit는 다른 어떤 것도하지 않는 것처럼 ISE를 닫는 것으로 보입니다. 단순히 컨텍스트를 종료하면 (예 : 스크립트 완성)이 작업을 수행하지 않습니다.
Bill K

1
@BillK 실제로. 답변을 업데이트했습니다. 내가 이것을 처음 썼을 때 나는 Exit에 대한 공식적인 문서를 찾지 못했다는 것을 기억한다. 나는 다음을했다 Get-Command Exit하고 Get-Alias Exit어떤 결과. 그런 다음 키워드인지 확인하고 공식적인 문서를 찾지 못했습니다. 그러나 지금 그것을 보면, 나는 그 결론에 어떻게 도달했는지 모른다. 분명히 키워드입니다 ( technet.microsoft.com/en-us/library/hh847744.aspx ). Exit는 자체적 인 about_ help 주제가없는 유일한 키워드 중 하나이므로 왼쪽 사이드 바의 주제 목록에 포함되지 않은 것일 수 있습니다.
New Guy

6
던지기는 어떻습니까?
JDC

80

ExitPowerShell도 종료됩니다. 현재 함수 또는 스크립트에서 "중단"하려면 다음을 사용하십시오. Break:)

If ($Breakout -eq $true)
{
     Write-Host "Break Out!"
     Break
}
ElseIf ($Breakout -eq $false)
{
     Write-Host "No Breakout for you!"
}
Else
{
    Write-Host "Breakout wasn't defined..."
}

5
break현재 기능에서 벗어나고 싶을 때는 사용하지 마십시오. 스크립트 호출도 중단 될 수 있습니다!
DannyMeister

49

쓰기 오류가 비 종료 오류이며 던져 오류를 종료하기위한 것입니다

Write-Error cmdlet은 종료되지 않는 오류를 선언합니다. 기본적으로 오류는 오류 스트림에서 호스트 프로그램으로 전송되어 출력과 함께 표시됩니다.

종료되지 않은 오류는 오류 스트림에 오류를 기록하지만 명령 처리를 중지하지는 않습니다. 입력 항목 콜렉션의 한 항목에서 종료되지 않는 오류가 선언되면 명령은 콜렉션의 다른 항목을 계속 처리합니다.

종료 오류를 선언하려면 Throw 키워드를 사용하십시오. 자세한 내용은 about_Throw ( http://go.microsoft.com/fwlink/?LinkID=145153 )를 참조하십시오 .


4
이것은 오류로 활동을 종료하는 가장 올바른 방법입니다. 호출자를 위임하여 오류 처리를 시도합니다. 이는 갑자기 종료하려고 시도하는 것보다 훨씬 낫습니다.
Paul Turner

나에게 적어도 모듈 함수에서는 exit를 던지지 만 exit 코드는 설정하지 않습니다. 이것은 예를 들어 CLI를 통해 실행되었습니다 powershell -command "& module-function ...". 실제로 오류 종료 코드를 출력하기 위해 래핑 try-catch에 던지고 해당 랩핑 캐치를 종료하도록 해당 함수를 변환해야했습니다.
Josh

2
잊지 마세요 $PSCmdlet.ThrowTerminatingError()단지 작업 (에서 없음 종료 오류로 알려진 문제를 끝낼 수 없습니다 던질 때 그 인스턴스에 대한 throw)
Djarid

33

이 프로세스를 종료하고 기본 운영 체제에 지정된 종료 코드를 제공합니다.

https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx

[Environment]::Exit(1)

이를 통해 발신자로부터받을 수있는 특정 종료 코드를 사용하여 종료 할 수 있습니다.


3
PowerShell에서는 간단히 내장 Exit를 사용할 수 있습니다 (예 :) Exit 1.
Jonas

3
내장 엑시트가 항상 예상대로 작동하지는 않습니다. powershell에서 다음을 시도하십시오. "Exit 5"> test1.ps1 powershell.exe. \ test1.ps1 $ lastexitcode "[Environment] :: Exit (5)"> test2.ps1 powershell.exe. \ test2.ps1 $ lastexitcode
gabriwinter

1
[Environment]::Exit(1)스크립트에서 powershell 창을 호출하면 사용 exit하지 않는 것처럼 나타나는 부작용 이 있습니다.
Josh Desmond

25

나는 당신이 Return대신 찾고 있다고 생각합니다 Break. Break는 일반적으로 루프에 사용되며 가장 안쪽의 코드 블록에서만 나옵니다. Return 키를 사용하여 함수 또는 스크립트를 종료하십시오.


7
이것은 정확하지 않습니다. OP는 특히 함수 내에서 스크립트를 종료하도록 요청 합니다 . Return스크립트가 아닌 함수에서 간단히 반환됩니다. ( 스크립트 Return최상위 수준에서는 스크립트를 종료하지만 문제는 아닙니다.)
Michael Sorens

1
이 '답변'이 실제로 EverydayNerd 답변에 대한 의견입니까?
tkokasih

22

오류 이유를 명확히하려면 예외를 던지는 것이 특히 좋습니다.

throw "Error Message"

종료 오류가 발생합니다.


3
나는 이것이 거의 1 년 전에 그렉 브레이의 답변보다 더 많은 것을 추가하지 않는다고 생각합니다. stackoverflow.com/a/20556550/695671
Jason S

12

"트랩"을 사용하는 것이 좋습니다. PowerShell 트랩은 종료 또는 오류 발생시 실행할 코드 블록을 지정합니다. 유형

Get-Help about_trap

트랩 문에 대해 더 자세히 알아보십시오.


10

나는 우연히 것을 알아 냈다 (예를 들어 단순히 , 라벨 어디 하지 않습니다 존재는 ()도 함수 내에서) 전체 스크립트의 탈옥 나타나고 살아있는 호스트를 유지합니다. 이렇게하면 현재 범위를 알지 못하고 레이블을 만들지 않고도 스크립트를 어디에서나 중단시키는 기능 (예 : 재귀 루프)을 만들 수 있습니다.Break <UnknownLabel>Break ScriptScript

Function Quit($Text) {
    Write-Host "Quiting because: " $Text
    Break Script
} 

1
귀하의 답변은 사실이지만, 전체 스크립트를 종료하려는 욕구에 동의하지 않으면 스크립트 발신자에게 문제가 발생할 수 있습니다. stackoverflow.com/questions/45746588/…
DannyMeister

5

나는 이것을 프로그램의 재실행에 사용했다. 도움이 될지 모르겠지만 두 가지 항목 만 필요한 간단한 if 문입니다. 그것은 나를 위해 powershell에서 일했습니다.

$rerun = Read-Host "Rerun report (y/n)?"

if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

이것이 도움이되는지 모르겠지만, 프로그램을 실행 한 후에 프로그램이 종료되는 줄을 믿습니다. 그러나이 경우 정의 된 모든 입력에는 나열되고 분류 된 출력이 필요합니다. 엑시트가 새 프롬프트 라인을 호출하고 프로그램을 종료하도록 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.