좋은 PowerShell 스크립트의 핵심 부분 중 하나는 오류 처리입니다. 에서도 가장 짧은 스크립트를 처리할 수 있는 오류가 있는지 확인하는 데 도움이 예상치 못한 이벤트에 가지 않을 것이다 난파하는 시스템을 당하게 작업을 수행할 수 있습니다. 아래 예를 들어보십시오. 매주에서 우리의 견본사(MyCompany.Com)인가 목록을 업로드하고 대한 액세스 권한이 있어야 하는 비용에 데이터베이스입니다., 이름이 목록에 없는 시간에서 우리는 그룹에서 제거하고 사용자는 더 이상 로그인할 수 있는 비용 청구:
이제 당신이 볼 수 있는 곳이 잘못된다. 1 주일 HR 은 목록을 업로드하거나 목록에 액세스하려고하는 것처럼 파일 서버가 사망하지 않습니다. 갑자기 PowerShell 이 Get-Content cmdlet 에 오류를 발생시키고$AuthorizedUser 변수는 비어 있습니다. 기 때문에 우리의 스크립트가 처리하지 않 오류가 계속 실행하고,매우 짧은 시간에,그것은 제거하는 모든 사용자에서 우리의 비용 그룹입니다., 곧 성난 전화 통화에서 홍수 시작 하 고 생활 좀 덜 행복 가져옵니다. 하는 것을 방지하기 위해 이 모든 것을 잡으려고 오류와 그런 다음 이벤트를 처리하는 그들을 발생(이 경우에는 정지 스크립트와에서 소리가 누군가에서 HR).
종료하고 아닌 종료하는 오류를
중 하나 고려해야 할 중점 사항을 알아 때를 잡는 오류를은 특정 오류를 잡힐 수 있습니다 기본적으로 합니다. 오류는 종료 및 비 종료의 두 가지 유형으로 제공됩니다. 종료 오류는 기능 또는 작업을 중지하는 오류입니다., 구문 오류를 만들거나 메모리가 부족하면 종료 오류입니다. 종료 오류를 포착하고 처리 할 수 있습니다. 종료되지 않는 오류는 Powershell 을 계속할 수있게하며 일반적으로 cmdlet 또는 기타 관리되는 상황에서 발생합니다. 정상적인 상황에서 그들은 시도-캐치-마지막으로 잡힐 수 없습니다. 위의 예에서 Get-Content 오류는 종료되지 않는 오류입니다.
비 종료 오류를 종료
로 처리하므로 비 종료 오류를 어떻게 잡습니까? 기본적으로 PowerShell 에 종료로 취급하도록 지시합니다. 이렇게하려면 ErrorAction 매개 변수를 사용합니다., 모든 PowerShell cmdlet 은 ErrorAction 을 지원합니다. Cmdlet 의 끝에-ErrorAction Stop 을 지정하면 발생하는 모든 오류가 종료로 처리되고 잡힐 수 있는지 확인합니다. 위의 예에서 우리는 우리를 변경하려의 콘텐츠선:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
치료하는 모든 오류를 종료
그것은 또한 가능한 치료하는 모든 오류를 종료를 사용하 ErrorActionPreference 변수입니다. 작업중인 스크립트 또는 전체 PowerShell 세션에 대해이 작업을 수행 할 수 있습니다. 스크립트에서 설정하려면 첫 번째 줄$ErrorActionPreference=Stop 을 만드십시오., 세션에 맞게 설정하려면 PowerShell 콘솔에서$ErrorActionPreference=Stop 을 입력하십시오.
길을 끄는 종료 오류가
일단 당신이 지켜지는 오류는 당신이를 잡으려고 노력이 될 것으로 처리 종료할 수 있습을 구축하려고 Catch 블록 명령(또는 명령의)일으킬 수 있는 오류가 있습니다. 첫 번째 단계는 시도 블록으로 오류를 던질 수있는 스크립트의 섹션을 둘러싸는 것입니다. 이 예에서 Get-Content 라인은 다음과 같습니다.
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
Try 블록 직후에 오류를 처리하기 위해 Catch 블록을 배치해야합니다., 캐치 블록은 종료 오류가 발생한 경우에만 액세스되며 그렇지 않으면 무시됩니다. 우리의 예에서 우리는 오류가 발생했다고 말하고 스크립트를 중지하기 위해 관리자에게 이메일을 보내려고합니다. 의 콘텐츠선은 지금:
에 액세스하는 오류를 기록
일단 당신이 당신 내부 catch 블록 당신은에 액세스할 수 있는 오류를 기록,저장되는 현재에서 개체 변수,$_. 오류 레코드에는 다양한 유용한 속성이 있지만 액세스하려는 주요 속성은$_입니다.예외., 예외는 우리가 정말로 다루고 여기 우리가 잡을 다루는 오류를–예외는 이벤트의 예기치 않은 오류가 발생한(는 오류를 기록 그 자체가 실제적으로 단말에 대한 래퍼 제외하려면 사용자). 우리가 붙잡고있는 예외와 문제에 대한 모든 정말로 유용한 정보를 포함하는 예외입니다. 우리의 예외를 야기한 더 근본적인 문제가 있었다면$_에도 기록됩니다.예외.innerexception(등-다음 기본 예외는$_에 저장됩니다.예외.innerexception.,innerexception 등.). 우리 예제의 목적을 위해 우리는$_를 사용하려고합니다.예외$_를 사용하여,우리의 알림 이메일에 몇 가지 추가 정보를 넣어합니다.예외.메시지와$_.예외.항목 이름 속성:
길을 끄는 특정 예외
이제로,우리의 예에 서 우리는길을 끄는 오류를 발생하는 동안 파일을 읽을 다루는 그들 모두에서 동일한 방법입니다. 할 수 있습 그러나 catch 특정 예외들 및격으로 그들과 다르게이지만,그것은 큰하지만 경우에만 원래 오류를 종료됩니다., 기 때문에 얻 콘텐츠 cmdlet 투 종료되지 않는 오류를(는 우리만 있으로 처리 종료를 사용하여 ErrorAction)우리는 수 없는 특별히 잡아 다른 예외는 cmdlet 수 있습니다. 이것은 PowerShell 의 기능이며 ErrorActionPreference 에 관계없이 종료되지 않는 오류에 적용되며 변경할 수 없습니다. 그래도 읽기 작업 중에 잘릴 수있는 메모리 부족 오류와 같은 다른 종료 예외를 처리 할 수 있습니다. 이 예제의 목적을 위해 우리가 할 것입니다.,
Catch 키워드 바로 뒤에 예외 이름을 지정하여 특정 종료 오류를 잡습니다. 우리의 예에서 우리는 시스템을 잡으려고합니다.OutOfMemory 예외와,우리가 하나를 얻을 경우,즉시 컴퓨터를 재부팅 아무 말도 접근 방식을 취할 것입니다. 우리는 또한 포함됩니다 일반적인 catch 블록 후 파일을 발견하지 않 블록 다른 모든 예외를 catch:
마지막으로 사용하여,마지막으로
의 마지막 부분을 잡으려고 마침내는 마지막으로 차단합니다. 이것은 캐치 블록 직후에 정의되어야하며 오류가 있었는지 여부에 관계없이 매번 실행됩니다., 이러한 방식으로 작업의 성공 또는 실패 여부에 관계없이 수행해야 할 작업을 수행할 수 있습니다. 우리의 예에서 우리는 파일 읽기가 시도되었음을 기록하려고합니다. 우리의 Get-Content 라인은 이제 다음과 같습니다.