함수 내에서 복구 할 수없는 오류가 발생할 때 PowerShell (PS1) 스크립트를 종료하는 방법을 찾고있었습니다. 예를 들면 다음과 같습니다.
function foo() {
# Do stuff that causes an error
$host.Exit()
}
물론과 같은 것은 없습니다 $host.Exit()
. 이 $host.SetShouldExit()
있지만 실제로 콘솔 창을 닫습니다. 원하는 것은 아닙니다. 내가 필요한 것은 sys.exit()
추가 스크립트없이 현재 스크립트의 실행을 중단하는 Python과 동등한 것입니다.
편집 : 네, 그냥 exit
있습니다. 어.
답변
답변
나는 이것이 오래된 게시물이라는 것을 알고 있지만이 주제를 검색 할 때 최고의 검색 결과 중 하나이기 때문에이 스레드로 돌아 오는 것을 많이 발견합니다. 그러나 나는 상충되는 정보로 인해 항상 혼란스러워합니다. 궁극적으로 나는 항상 알아 내기 위해 자체 테스트를 수행해야합니다. 이번에는 결과를 게시하겠습니다.
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 }
답변
Exit
PowerShell도 종료됩니다. 현재 함수 또는 스크립트에서 “중단”하려면 다음을 사용하십시오. 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..."
}
답변
쓰기 오류가 비 종료 오류이며 던져 오류를 종료하기위한 것입니다
Write-Error cmdlet은 종료되지 않는 오류를 선언합니다. 기본적으로 오류는 오류 스트림에서 호스트 프로그램으로 전송되어 출력과 함께 표시됩니다.
종료되지 않은 오류는 오류 스트림에 오류를 기록하지만 명령 처리를 중지하지는 않습니다. 입력 항목 콜렉션의 한 항목에서 종료되지 않는 오류가 선언되면 명령은 콜렉션의 다른 항목을 계속 처리합니다.
종료 오류를 선언하려면 Throw 키워드를 사용하십시오. 자세한 내용은 about_Throw ( http://go.microsoft.com/fwlink/?LinkID=145153 )를 참조하십시오 .
답변
이 프로세스를 종료하고 기본 운영 체제에 지정된 종료 코드를 제공합니다.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
이를 통해 발신자로부터받을 수있는 특정 종료 코드를 사용하여 종료 할 수 있습니다.
답변
나는 당신이 Return
대신 찾고 있다고 생각합니다 Break
. Break는 일반적으로 루프에 사용되며 가장 안쪽의 코드 블록에서만 나옵니다. Return 키를 사용하여 함수 또는 스크립트를 종료하십시오.
답변
오류 이유를 명확히하려면 예외를 던지는 것이 특히 좋습니다.
throw "Error Message"
종료 오류가 발생합니다.