당신은 이제까지 스크립트를 실행 또는 PowerShell microsoft azure 얻을 직면 소리를 지르는 벽의 텍스트에 붉은 아래와 같은?
오류가 될 수 있는 압도적인 탐색 할 수 있습니다. 그리고 무엇보다도 오류는 종종 읽기 어렵 기 때문에 스크립트가 무엇이며 어디에서 잘못되었는지 결정하는 것은 불가능합니다.,
다행히도 오류 처리를 통해이를 더 잘 수행 할 수있는 PowerShell 에 몇 가지 옵션이 있습니다. 오류 처리를 사용하면 오류를 필터링하고 이해하기가 더 쉬운 방식으로 표시 할 수 있습니다. 그리고 오류를 이해하면 오류 처리에 더 많은 논리를 쉽게 추가 할 수 있습니다.
이 문서에서,당신은 당신에 대해 배울 것입니다에서 오류를 PowerShell 및할 수 있는 방법을 가로챌 수행하는 오류 처리 PowerShellTry Catch
블록(그리고finally
블록).,
테이블의 내용.
는 방법을 이해 오류를 작업에 PowerShell
전에 다이빙으로 오류 처리하자,처음 몇 가지 개념을 주변에 오류가 있습니다. 오류를 이해하면 더 나은 오류 처리 전략으로 이어질 수 있습니다.
는$오류 자동 변수
PowerShell,많은 자동 변수,그리고 그 중 하나는$Error
자동 변수가 있습니다. PowerShell 은$Error
변수를 사용하여 세션에서 발생하는 모든 오류를 저장합니다., $Error
변수는 가장 최근에 정렬 된 오류 배열입니다.
PowerShell 세션을 처음 열면$Error
변수가 비어 있습니다. $Error
변수를 호출하여 확인할 수 있습니다.
당신이 볼 수 있듯이,$Error
variable 시작은 비어 있습니다., 그러나 오류가 생성되면 오류가 추가되어$Error
변수에 저장됩니다.아래 예에서 오류는 존재하지 않는 서비스 이름을 의도적으로 가져 와서 생성됩니다.
PS> Get-Service xyzPS> $ErrorPS> $Error.Count
에서 볼 수 있듯이 위의 출력 생성되는 오류가 추가되었$Error
variable.,
$Error 변수에는 PowerShell 세션에서 생성된 오류 모음이 포함되어 있습니다. 각 오류는 배열 위치를 호출하여 액세스 할 수 있습니다. 최신 오류는 항상 인덱스 0 에있을 것입니다.
예를 들어
$Error
를 사용하여 최신 오류를 검색 할 수 있습니다.
는$오류가 객체 속성
기 때문에 모든 것을 PowerShell 은 개체는$Error
variable 은 객체이며,개체의 속성입니다., 파이프$Error
변수를Get-Member
cmdlet,당신의 목록을 참조하십시오 속성을 사용할 수 있다.
$Error | Get-Member
을 결정에 오류 이유 당신이 볼 수 있는 콘텐츠의InvocationInfo
속성을 사용하여 아래의 명령.,
$Error.InvocationInfo
이제 당신이 할 수 있과 같은 다른 속성을 발견하고 다른 어떤 정보를 찾을 수 있습니다!
종료 오류
종료 오류는 PowerShell 대 종료되지 않은 오류가 발생하면 실행 흐름을 중지합니다. 종료 오류가 발생할 수있는 몇 가지 방법이 있습니다. 한 가지 예는 존재하지 않는 매개 변수로 cmdlet 을 호출하는 경우입니다.,
으로 당신은에서 아래 스크린샷,는 경우는 명령Get-Process notepad
실행하는 명령이 유효한 정보의 메모 프로세스가 표시됩니다.
지만,경우에는 매개변수가 존재하지 않는 처럼 사용하는Get-Process notepad -handle 251
, cmdlet 는 오류를 표시하는handle
매개 변수가 유효하지 않습니다. 그런 다음 cmdlet 은notepad
프로세스의 세부 정보를 표시하지 않고 종료됩니다.,
아닌 종료하는 오류를
아닌 종료하는 오류를는 오류를 하지 않는지 스크립트를 실행하는 명령입니다. 예를 들어 아래 코드를 확인하십시오. 이 코드는 파일 목록에서 파일 이름 목록을 가져옵니다.txt 파일. 그런 다음 스크립트는 각 파일 이름을 거쳐 각 파일의 내용을 읽고 화면에 출력합니다.
$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}
파일 목록의 내용.,txt 파일은 파일 이름이 아래 목록에 표시됩니다.나는 이것이 내가 할 수있는 유일한 방법이라고 생각한다.로그가 실제로 존재하지 않았습니까? 코드를 실행할 때 스크립트가 File_6 을 찾을 수 없기 때문에 오류가 발생할 것으로 예상됩니다.로그. 아래 그림과 비슷한 출력이 표시됩니다.
에서 볼 수 있듯이 스크린샷의 결과가 상기에,스크립트를 읽을 수 있는 첫 번째 다섯 개의 파일 목록에 있지만,그것을 읽으려고 파일 File_6.,txt,오류가 반환됩니다. 그런 다음 스크립트는 종료하기 전에 나머지 파일을 계속 읽었습니다. 그것은 종료되지 않았다.
$ErrorActionPreference 변수
지금까지 종료 및 비 종료 오류와 서로 어떻게 다른지에 대해 배웠습니다. 그러나 종료되지 않은 오류가 종료 오류로 처리되도록 강제 할 수 있다는 것을 알고 계셨습니까?
PowerShell 에는 기본 설정 변수라는 개념이 있습니다. 이러한 변수는 PowerShell 이 여러 가지 방식으로 동작하는 방식을 변경하는 데 사용됩니다. 이러한 변수 중 하나는$ErrorActionPreference
라고합니다.,
$ErrorActionPreference
변수는 PowerShell 이 비 종료 오류를 처리하는 방식을 변경하는 데 사용됩니다. 기본적으로$ErrorActionPreference
값은Continue
로 설정됩니다. $ErrorActionPreference
변수의 값을STOP
로 변경하면 PowerShell 이 모든 오류를 종료 오류로 처리합니다.
아래 코드를 사용하여$ErrorActionPreference
값을 변경하십시오.,
$ErrorActionPreference = "STOP"
에 대해 자세히 알아보려면 유효$ErrorActionPreference 변수 값을 방문,PowerShell ErrorActionPreference.
이제이 기사의 비 종료 오류 섹션에서 사용 된 예제를 다시 참조하십시오. 스크립트를 수정할 수 있습을 포함 변화$ErrorActionPreference
코드와 같은 다음과 같습니다:
실행된 코드는 위의 행동을 다르게 이전보다면$ErrorActionPreference
값으로 설정의 기본값은Continue
.,
에서 볼 수 있듯이 스크린샷의 결과를 위, 스크립트를 읽을 수 있는 첫 번째 다섯 개의 파일 목록에 있지만,그것을 읽으려고 파일 File_6.파일을 찾을 수 없기 때문에 오류가 반환됩니다. 그런 다음 스크립트가 종료되고 나머지 파일은 읽지 않습니다.,
$ErrorActionPreference
값은 현재 PowerShell 세션에서만 유효합니다. 새로운 PowerShell 세션이 시작되면 기본값으로 재설정됩니다.
이 ErrorAction 일반적인 매개 변수
경우에는$ErrorActionPreference
값을 적용 PowerShell 세션,ErrorAction
매개변수에 적용되는 모든용 skype 지원하는 공통 매개 변수입니다. ErrorAction
매개 변수는 동일한 값을$ErrorActionPreference
변수는 않습니다.,
ErrorAction
매개 변수 값이$ErrorActionPreference
값보다 우선합니다.다시 돌아가서 이전 예제에서 동일한 코드를 사용합시다. 그러나 이번에는ErrorAction
매개 변수가Get-Content
라인에 추가됩니다.
실행한 후에는 변경된 코드에,당신은 당신이 볼 것이지만$ErrorActionPreference
설정Continue
스크립트는 여전히 종료된 후 오류가 발생했습니다., 스크립트의 종료되기 때문에-ErrorAction
매개 변수 값에서Get-Content
설정STOP
.
PowerShell 사용하려고 Catch 블록
이 시점에서, 에 대해 알아보았으므로 PowerShell 오류를 어떻게$ErrorActionPreference
변ErrorAction
매개 변수를 작동합니다., 이제 powershellTry Catch Finally
블록 인 좋은 물건에 대해 배울 때입니다.
PowerShelltry catch
블록(및 선택 사항finally block
)하는 방법 그물을 던져 주위에 코드 조각을 잡을 어떠한 오류는 반환합니다.
아래 코드는Try
문의 구문을 보여줍니다.
try { <statement list>}catch *]{ <statement list>}finally { <statement list>}
Try
블록의 코드가 포함되어 원하는 PowerShell 하”시도”고 모니터링을 위한 오류가 있습니다., 는 경우에는 코드는Try
블록에 오류가 발생하면 오류가 추가하는$Error
변수와 그런 다음 전달을Catch
block.
Catch
블록을 포함한 조치를 실행하를 받을 때의 오류에서Try
block. ATry
문에 여러 개의Catch
블록이있을 수 있습니다.
Finally
블록은Try
문의 끝에 해당 코드를 포함합니다., 이 블록은 오류가 감지되지 않았는지 여부와 상관없이 실행됩니다.
를 잡는 비은 특정 오류(Catch-All)
간단한Try
성명을 포함하는Try
및Catch
block. Finally
블록은 선택 사항입니다.
예를 들어,비특이적 예외를 잡으려면Catch
매개 변수가 비어 있어야합니다. 예 아래 코드를 사용하는 스크립트와 동일한 스크립트에서 사용되었다는$ErrorActionPreference 변 섹션에서만 사용하도록 수정하는Try Catch
블록이 있습니다.,
에서 볼 수 있듯 아래 코드,이번foreach
문으로 묶은 내부에는Try
block. 그는Catch
블록에 포함되를 표시하는 코드를 문자열An Error Occurred
오류가 발생한 경우 일이 일어났습니다. Finally
블록의 코드는$Error
변수를 지 웁니다.위의 코드는 PowerShell 에서 실행 한 후 아래에 표시된이 출력을 제공합니다.,
출력을 위에 보여줍니다 스크립트 오류가 발생했,실행 코드 안에Catch
블록,다음을 종료됩니다.오류 처리의 요점이었던 오류가 처리되었습니다. 그러나 표시된 오류는 너무 일반적이었습니다. 하여 보다 자세한 설명이 포함된 오류가 발생하면,당신은에 액세스할 수 있는Exception
속성의 오류에 의해 전달 되었Try
block.,
아래 코드를 수정,특히 코드 안에Catch
블록을 표시하는 예외 메시지가에서는 현재 오류는 아래로 통과되었 파이프라인–$PSItem.Exception.Message
이번에는,때 수정된 위의 코드를 실행하면 메시지가 표시되는 많은 설명을 포함합니다.,
길을 끄는 특정 오류가
이있을 때 시간이 모두 포괄하는 오류 처리하지 않은 가장 적절한 방법이다. 아마도 스크립트가 발생하는 오류 유형에 따라 달라지는 작업을 수행하기를 원할 것입니다.오류 유형을 어떻게 결정합니까? 마지막 오류의Exception
속성의TypeName
값을 확인하여., 예를 들어 오류를 발견 유형에서 이전를 들어,다음과 같은 명령을 사용합니다.
$Error.Exception | Get-Member
의 결과로 위의 코드는 것이 아래 스크린샷처럼 표시됩니다. 보시다시피TypeName
값이 표시됩니다–System.Management.Automation.ItemNotFoundException
.
이제 당신이 알고있는 오류를 입력해야 하는 차단하는 코드를 수정하여 그것을 잡으니다., 아래의 수정 된 코드에서 볼 수 있듯이 이제 두 개의Catch
블록이 있습니다. 첫 번째Catch
블록은 특정 유형의 오류(System.Management.Automation.ItemNotFoundException
)를 가로 챕니다. 반면 두 번째Catch
블록에는 일반적인 catch-all 오류 메시지가 포함됩니다.
아래 스크린 샷은 위의 수정 된 코드의 출력을 보여줍니다.,
결론
이 문서에서,당신은 배의 오류에 대 PowerShell,그것의 속성을 확인할 수 있는 방법을 오류의 특정 유형입니다. 당신도 배운 사이의 차이는 방법$ErrorActionPreference
변ErrorAction
매개 변수에 영향을 미치는 방법 PowerShell 취급 비 종료하는 오류가 있습니다.,
있도를 사용하는 방법을 배웠 PowerShellTry Catch Finally
블록을 수행하는 오류를 처리하는지 여부에 대한 특정한 또는 오류를 모두 포괄하는 접근 방식이다.
이 기사에 표시된 예제는Try Catch Finally
블록이 어떻게 작동하는지에 대한 기본 사항 만 보여줍니다. 지식 나는 당신이 얻고있는 이 문서를 제공해야를 시작 블록을 적용을 시작에서 오류 처리하는 스크립트.,
추가 읽기
- About_Try_Catch_Finally
- About_Automatic_Variables
- 기초를 다시:PowerShell foreach 루프
- 다시 기본 사항 이해 PowerShell 개체