PowerShell을 사용하여 Catch finally를 사용하여 오류를 처리하는 방법

2021년 7월 15일 10258 견해 PowerShell에 대한 기타 중요 정보 Try

파워셸 캐치 시도 블록은 PowerShell 스크립팅에서 오류를 처리하는 데 사용됩니다. PowerShell을 사용할 때 캐치 시도 스크립팅 블록을 사용하면 다음을 달성할 수 있습니다.





  1. 오류에도 불구하고 스크립트가 계속 실행되도록 합니다.
  2. 더 나은 오류 메시지 표시 및 처리

이 가이드에서는 Powershell을 사용하는 방법을 배웁니다. 캐치 시도 PowerShell에서 종료 오류 메시지를 처리하기 위한 블록. 또한 다음을 포함하는 방법을 배우게 됩니다. 드디어 에 차단 캐치 시도 블록.



이 가이드는 다음 구문으로 시작합니다. 캐치 시도 블록.

게시물 주제 찾아보기



파워쉘 캐치 시도 통사론

PowerShell Try Catch 구문

PowerShell의 구문 캐치 시도 이다…



|_+_|

그만큼 노력하다 PowerShell에서 오류를 모니터링할 블록의 일부입니다. 이것은 종료 오류를 반환할 수 있는 원래 스크립트가 있는 블록입니다.

Try 블록에서 오류가 발생하면 PowerShell은 오류를 $Error 자동 변수에 저장합니다(자세한 내용은 나중에 설명).



한편, t 그 잡다 PowerShell의 설명 캐치 시도 블록은 try 블록에서 생성된 오류를 처리합니다. 내에서 처리되는 오류 유형을 지정할 수도 있습니다. 잡다 문 블록.



그만큼 드디어 블록은 스크립트에서 더 이상 필요하지 않은 리소스를 해제하는 데 사용할 수 있습니다.

PowerShell의 일반적인 예외 오류 유형 캐치 시도

PowerShell Try Catch의 오류 유형

PowerShell Try Catch 블록에서 다양한 유형의 오류를 처리할 수 있습니다. 예를 들어 특정 오류를 처리할 수 있습니다.

또한 일반 오류 메시지를 처리할 수 있습니다. 그러나 특정 유형의 오류를 처리하려면 오류 유형을 알아야 합니다.

이 가이드의 뒷부분에서 오류 메시지가 $error 자동 변수에 저장된다는 것을 알게 될 것입니다. 또한 $_ 파이프라인 변수에 오류가 저장될 수도 있습니다.

또한 $error 자동 변수에 저장된 오류는 배열로 저장됩니다. 이를 설명하기 위해 종료 오류 메시지를 반환하는 명령을 실행해 보겠습니다.

이전에 저장한 모든 오류를 지우려면 $오류 자동 변수, 아래 명령을 실행하기 전에 먼저 $error.Clear() 명령. |_+_| Systerr라는 이벤트 로그가 없으므로 Try 블록의 명령은 오류 메시지를 표시합니다.

놀랍게도 이 명령은 오류 메시지를 표시하지 않았습니다. 그렇다면 오류 메시지는 어떻게 되었습니까?

$error 자동 변수에 저장됩니다! $error 변수에 저장된 마지막 명령의 오류를 표시하려면 다음 명령을 실행하십시오.

|_+_|

명령의 결과는 $error 자동 변수에 저장된 오류 세부 정보를 표시합니다. 오류 정보에는 완전 자격 오류 ID .

이 특정 오류의 경우 완전 자격 오류 ID 두 가지 정보 집합이 있습니다. System.InvalidOperationException 그리고 Microsoft.PowerShell.Commands.GetEventLogCommand .

우리가 관심을 가지고 있는 정보는 System.InvalidOperationException . 이것은 당신이 할 수있는 오류 유형입니다 잡다 PowerShell Try Catch 블록에서.

이 PowerShell 예외의 이름을 가져오려면 아래 명령을 실행하십시오.

|_+_|

거기는, System.InvalidOperationException !

다음 몇 개의 하위 섹션에서는 일반적인 PowerShell Try Catch 예외 오류에 대해 설명합니다.

PowerShell 시도 캐치 CommandNotFoundException 오류

PowerShell 또는 Microsoft 명령 프롬프트에 없는 명령을 실행하면 오류 메시지가 표시됩니다. 예를 들어 파일 가져오기 명령을 실행하면 이 명령이 유효한 PowerShell Cmdlet이 아니므로 오류 메시지가 표시됩니다.

다음은 PowerShell의 명령 결과에 대한 스크린샷입니다...

PowerShell은 CommandNotFoundException 오류를 잡으려고 시도합니다.

스크린샷에서 볼 수 있듯이 예외 유형(FullyQualifiedErrorId)은 CommandNotFoundException .

이것은 종료 오류이므로 스크립트가 계속되지 않습니다. 이 오류로 인해 스크립트가 종료되지 않도록 하려면 명령을 캐치 시도 블록.

PowerShell Try Catch 블록에서 이 오류를 래핑하면 PowerShell에서 오류를 표시하지 않습니다. 또한 스크립트 종료를 중지합니다.

그러나 오류가 억제되더라도 $error 변수에 저장됩니다. 평소와 같이 아래 명령을 실행하기 전에 먼저 $error 변수에 저장된 오류를 지우십시오.

|_+_|

PowerShell ISE 대신 PowerShell에서 명령을 실행하려면 아래와 같이 한 줄에 명령을 입력합니다.

|_+_|

그런 다음 오류를 표시하려면 다음을 실행하십시오.

|_+_|

이 섹션의 주요 소개에서 언급했듯이 이 오류에 대한 예외 ID를 표시하려면 아래 명령을 실행하십시오.

|_+_|

예외의 전체 이름은 System.Management.Automation.CommandNotFoundException .

PowerShell 시도 캐치 ManagementObjectNotFoundException 오류

잘못된 정보로 원격 PS 세션에서 명령을 실행하면 PowerShell은 ManagementObjectNotFoundException 오류.

일반적인 시나리오는 PowerShell을 사용하여 Office 365에 연결할 때입니다. 그런 다음 Get-User 명령을 실행하지만 잘못된 사용자를 제공하십시오. 신원 .

PowerShell은 ManagementObjectNotFoundException 오류를 잡아보십시오.

PowerShell Try Catch로 이 오류를 잡으려면 아래와 유사한 명령을 사용하십시오.

|_+_| 잡기 ManagementObjectNotFoundException PowerShell Try의 오류, Catch는 특히 까다롭습니다. 당신은 사용해야합니다 오류 작업 매개변수 및 지정 중지 . 그렇지 않으면 Try, Catch를 사용해도 오류가 계속 표시됩니다.

마지막으로 예외의 이름을 얻으려면 아래 명령을 사용하십시오.

|_+_|

이 명령은 예외 유형을 다음과 같이 반환합니다. System.Management.Automation.RemoteException . 그래서, 무엇입니까 ManagementObjectNotFoundException ?

ManagementObjectNotFoundException 아래 명령으로 확인된 예외의 이유는 다음과 같습니다.

|_+_|

PowerShell 시도 캐치 무단 액세스 예외 오류

또 다른 일반적인 PowerShell 예외 오류는 무단 액세스 예외 . 이 유형의 오류는 최소한 읽기 권한이 없는 항목에 액세스하려고 할 때 발생합니다.

이 예를 설명하기 위해 인증된 사용자가 내 컴퓨터의 특정 파일에 액세스하는 것을 거부했습니다.

starz play 활성화 코드
PowerShell은 UnauthorizedAccessException 오류를 잡으려고 시도합니다.

이제 Get-Content 명령으로 파일에 액세스하려고 하면 액세스 거부 메시지가 나타납니다.

|_+_|

이 오류 표시를 중지하려면 아래와 같이 PowerShell Try Catch 블록 내에서 명령을 실행하십시오.

|_+_|

불행히도 위의 명령은 오류 표시를 중지하지 않습니다. 그 이유는 종료 오류가 아니기 때문입니다.

오류 표시를 중지하려면 다음을 포함하십시오. 오류 작업 매개변수 및 지정 중지 .

|_+_|

이제 명령이 오류를 표시하지 않습니다. 예외 유형을 표시하려면 아래 명령을 실행하십시오…

|_+_|

예외 유형은 System.UnauthorizedAccessException .

이 섹션에서 다루는 것보다 더 많은 유형의 예외 오류가 있습니다. 가장 일반적인 예외 유형만 다루었습니다.

PowerShell Try Catch로 특정 예외를 캡처하는 방법

PowerShell Try Catch로 특정 예외를 캡처하는 방법

마지막 섹션에서는 일반적인 PowerShell 예외와 예외 유형을 찾는 방법에 대해 설명했습니다. 이 섹션에서는 해당 정보를 사용하여 특정 유형의 오류 메시지를 캡처하는 방법을 설명합니다.

이 가이드의 구문 섹션에서 PowerShell Try Catch finally의 일반 구문은 다음과 같다고 말했습니다.

|_+_|

구문의 catch 블록에서 [오류 유형]을 볼 수 있습니다. 여기에서 이 블록에서 포착하려는 오류 유형을 지정합니다.

예를 들어 UnauthorizedAccessException 오류를 잡으려면 아래 명령문을 사용하십시오.

|_+_|

PowerShell에서 명령을 실행하려면 한 줄에 명령문을 지정하십시오. 문의 첫 번째 부분인 $error.Clear()는 $error 변수에 저장된 모든 오류를 지웁니다.

|_+_|

여러 개를 추가하는 방법 잡다 PowerShell의 블록 캐치 시도 성명

이 섹션의 도입부에서 특정 유형의 예외를 catch하는 방법을 보여 주었습니다. 잡다 블록. 여러 개를 지정할 수 있습니다.

다음은 예입니다…

|_+_|

이 예에서 첫 번째 잡다 블록은 지정된 유형의 예외를 처리합니다. 게다가 두 번째 잡다 블록 핸들은 일반 오류를 처리합니다.

PowerShell Try Catch로 오류 예외를 추출하는 방법

마지막 하위 섹션에서는 다양한 유형의 예외를 처리하기 위해 여러 catch 블록을 지정하는 방법에 대해 설명했습니다. 이 하위 섹션에서는 예외에서 오류 세부 정보를 추출하는 방법을 배웁니다.

이를 설명하기 위해 이전에 사용한 예를 사용하겠습니다. PowerShell에서 이 PowerShell 문을 실행합니다.

|_+_|

이제 $error만 실행하세요...

|_+_|

$error 변수에 여러 정보가 저장되지만 실제 오류 메시지는 아래 스크린샷에서 강조 표시됩니다.

PowerShell Try Catch로 오류 세부 정보를 추출하는 방법

이 오류를 텍스트 파일에 기록하려면 실제 오류 세부 정보만 기록하면 됩니다. 이 오류를 추출하려면 아래 명령을 사용하십시오.

|_+_|

이 명령은 'D:PS-Tutorialfolder-names.txt' 경로에 대한 액세스가 거부되었다는 실제 오류 메시지를 추출합니다.

다음을 포함하여 이 오류 메시지를 로그 파일에 기록할 수 있습니다. 파일 아웃 Catch 블록의 명령입니다.

|_+_| 나는 포함했다 추가 매개변수 파일 아웃 이전 항목을 덮어쓰지 않고 여러 항목의 로깅을 허용하는 명령입니다.

마지막 명령어를 이해하기 쉽도록 아래 스크립트 형식으로 다시 작성해 보겠습니다...

|_+_|

A를 포함하는 방법 드디어 PowerShell로 차단 캐치 시도 성명

PowerShell Try Catch 문에 finally 블록을 포함하는 방법

다음을 포함할 수 있습니다. 드디어 PowerShell로 차단 캐치 시도 성명. 구문은

|_+_|

그만큼 마지막으로 블록은 스크립트에서 더 이상 필요하지 않은 리소스를 해제하는 데 사용할 수 있습니다.

스크립트를 중지하기 위해 CTRL+C를 사용하는 경우에도 finally 블록이 실행됩니다. Exit 키워드가 Catch 블록 내에서 스크립트를 중지하는 경우에도 블록이 실행됩니다.

마지막 예에서는 오류 로그를 텍스트 파일에 작성하는 명령문이 있습니다. 잡다 블록. 그러나 그 진술을 하기에 가장 좋은 곳은 드디어 블록.

아래 수정된 스크립트를 참조하십시오…

|_+_|

PowerShell Try Catch에 대한 유용한 추가 정보

PowerShell에 대한 기타 중요 정보 Try

이 섹션에서는 PowerShell Try Catch에 대한 간단하지만 유용한 정보를 공유합니다.

PowerShell Try Catch $Error 자동 변수를 지우는 방법

$error 자동 변수에는 분명한 방법. 이 메소드를 사용하여 $error 자동 변수에 저장된 모든 오류를 지울 수 있습니다.

현재 PowerShell 세션의 $error 자동 변수에 저장된 모든 오류를 지우려면 아래 명령을 실행합니다.

|_+_|

PowerShell Try Catch Block에서 사용자 지정 오류 메시지를 표시하는 방법

PowerShell Try Catch 블록에 사용자 지정 오류 메시지를 표시하려면 throw 단어를 사용합니다. 다음은 예입니다…

|_+_|

다음은 PowerShell ISE에서 이 스크립트의 결과입니다.

PowerShell Try Catch Block에서 사용자 지정 오류 메시지를 표시하는 방법

PowerShell에서 오류 CategoryInfo 정보를 가져오는 방법 Try Catch

$error 자동 변수에는 CategoryInfo라는 속성이 있습니다. 이 속성과 다른 속성과 메서드를 보려면 아래 명령을 실행하십시오…

|_+_|

마지막 명령에서 반환된 속성 중 하나가 호출됩니다. 카테고리정보 .

이 정보에 액세스하려면 아래 명령을 실행하십시오.

|_+_|

이 명령은 여러 하위 속성을 반환합니다.

PowerShell에서 오류 CategoryInfo 정보를 가져오는 방법 Try Catch

이러한 각 하위 속성은 마침표 뒤에 하위 속성 이름을 추가하여 액세스할 수 있습니다. 예를 들어 Reason 하위 속성을 표시하려면 아래 명령을 실행합니다.

|_+_|

PowerShell에서 오류 메시지를 표시하기 위해 Write-Host를 사용하는 방법 Try Catch

마지막 하위 섹션의 CategoryInfo 속성과 마찬가지로 $error 자동 변수에도 속성이 있습니다. 예외 . 오류에 예외를 표시하려면 아래 명령을 실행하십시오.

|_+_|

불행히도 Write-Host 명령으로 이 정보를 표시하려고 하면 예상대로 작동하지 않습니다.

|_+_|

PowerShell에서 이 명령의 결과는 다음과 같습니다.

PowerShell에서 오류 메시지를 표시하기 위해 Write-Host를 사용하는 방법 Try Catch

보시다시피 이 명령은 다른 많은 정보를 표시합니다. 좋은 소식은 $error.예외 라는 다른 속성이 있습니다. 메세지 .

이 하위 속성을 다음에 추가하여 호출할 수 있습니다. $error.예외 , 이와 같이…

|_+_|

또한 다음을 사용할 수 있습니다. 쓰기 호스트 이 오류 정보를 표시하는 명령…

|_+_|

마지막 명령은 이제 실제 오류 메시지를 표시합니다…

사용하는 특별한 이유가 있는 경우를 제외하고 쓰기 호스트 마지막 명령에 표시된 대로 다음을 사용하여 동일한 오류 메시지를 표시할 수 있습니다. $error.예외 명령.

PowerShell Try Catch 블록에서 해시 테이블을 만드는 방법

생성할 수 있는 두 가지 일반적인 방법이 있습니다. PowerShell 해시 테이블 Try Catch 블록에서.

  1. Try 블록 내에서 여러 키/값 쌍으로 해시 테이블을 만들 수 있습니다.
  2. 또는 다음을 사용하여 단일 키/값 해시테이블을 생성할 수 있습니다. 열쇠 밖에서 고양이 시도 h 블록 및 값 고양이 시도 h 블록.

다음은 첫 번째 방법의 예입니다...

|_+_|

보시다시피 hasttable은 고양이 시도 h 블록…

반면에 값이 정의된 단일 해시 테이블 키를 만들 수 있습니다. 고양이 시도 h 블록. 다음은 예입니다…

|_+_|

마지막 스크립트가 PowerShell 해시 테이블을 생성하는지 확인하기 위해 스크립트를 실행한 후 $hashtable 변수에 저장된 값을 호출했습니다.

마지막 명령의 결과에서 볼 수 있듯이 이름/값 쌍이 있습니다!

PowerShell 시도 캐치 예제

PowerShell 시도 캐치 예제

이 마지막 섹션에서는 PowerShell Try Catch 응용 프로그램의 여러 예를 다룹니다.

PowerShell을 사용하는 방법 캐치 시도 Get-Childitem 사용

Get-Childitem 명령은 여러 오류를 반환할 수 있습니다. 두 가지 일반적인 오류를 설명하기 위해 아래 두 가지 명령을 사용합니다.

|_+_|

마지막 명령에 사용된 텍스트 파일의 올바른 경로는 D:PS-Tutorialfilelist.txt입니다.

그러나 첫 번째 명령에서 D:PS-Tutorial 뒤에 공백을 포함했습니다. 이로 인해 오류가 발생했습니다(오류 세부정보는 곧 확인하겠습니다).

또한 두 번째 명령에서 올바른 경로를 지정했지만 잘못된 파일 이름을 사용했습니다. 이로 인해 오류가 발생했습니다.

|_+_| PowerShell 사용 방법 Get-Childitem으로 Catch 시도

계속해서 이러한 오류에 대한 자세한 정보를 얻기 위해 PowerShell에서 명령을 실행하겠습니다. 캐치 시도 블록.

|_+_|

우리의 첫 번째 작업은 명령에 의해 반환된 오류 유형을 결정하는 것입니다. 이 정보를 얻으려면 아래 명령을 실행하십시오…

|_+_|

다음은 명령의 결과입니다...

PowerShell Try Catch를 사용하여 Export-csv로 Get-WMIObject 오류 내보내기$error 자동 변수에 저장된 오류는 PowerShell 배열에 저장됩니다. 배열의 각 개체는 배열 끝에 [0], [1]을 추가하여 액세스합니다. 0은 배열의 첫 번째 항목을 나타내고 1은 두 번째 항목을 나타내는 식입니다.

에서 던진 오류에 대한 추가 정보 얻기로 돌아가기 Get-Childitem 명령을 사용하여 오류 유형을 기반으로 Try Catch 블록을 수정하여 이러한 2가지 유형의 오류를 캡처할 수 있습니다.

|_+_|

두 번째 작업은 실제 오류 메시지를 표시하는 것입니다. 이 명령은 다음 작업을 수행합니다.

|_+_|

이 명령은 두 개의 오류 메시지를 표시합니다…

PowerShell을 사용하는 방법 캐치 시도 Export-csv를 사용하여 Get-WMIObject 오류를 내보내려면

이 하위 섹션에서는 실행할 때 생성된 오류를 내보냅니다. Get-WMIObject 원격 컴퓨터에서 CSV 파일로 내보내기-csv 명령.

먼저 오프라인 원격 컴퓨터에 연결을 시도할 때 생성되는 오류 세부 정보를 살펴보겠습니다. Get-WMIObject . 이를 설명하려면 아래 명령을 실행하십시오...

|_+_|

명령이 오류 메시지를 생성했기 때문에 컴퓨터 유효한 PC 이름이 아닙니다.

PowerShell Try Catch 문으로 Get-Process 오류를 잡는 방법

계속해서 오류를 관리하기 위해 노력하다 블록 캐치 시도 성명.

|_+_|

의 첫 번째 줄에는 노력하다 블록에서 $ComputerName 변수를 정의했습니다. 그런 다음 두 번째 줄에서 다음을 실행했습니다. Get-WmiObject 명령.

또한, 잡다 블록, 오류 세부 정보를 생성하여 CSV 파일로 내보냈습니다. 내보내기-csv .

다음은 스크립트에 대한 자세한 설명입니다. 노력하다 블록:

  1. 1행에서 CSV 파일을 저장할 위치를 지정하는 $path 변수를 만들었습니다.
  2. 그런 다음 2행에서 Get-Date 명령을 사용하여 CSV 파일의 파일 이름을 만들었습니다. 파일 이름은 형식, yyyyMMdd_HHmmss.csv
  3. 3행에서 $data라는 변수에 저장된 빈 객체를 생성했습니다.
  4. 그런 다음 4행에서 3행에서 만든 개체에 'Computer Name' 열을 추가했습니다. 이 열은 $ComputerName 변수를 사용합니다.
  5. 5행에서 오류 메시지를 저장할 '오류 메시지' 볼륨을 추가했습니다. $error.Exception.메시지
  6. 그런 다음 6행에서 $path 및 $csvfilename 변수를 결합하여 CSV 파일의 전체 경로를 만드는 $csvfilepath 변수를 만들었습니다.
  7. 마지막으로 7행에서 $data 변수($ComputerName 및 $error.Exception.Message)에 저장된 정보를 내보내기-csv $csvfilepath에 파일을 저장했습니다.
그만큼 유형 정보 없음 Export-csv 명령의 매개변수는 유형 정보를 제거합니다. 자세한 내용은 Powershell NoTypeInformation: 애플리케이션 및 예제 가이드를 참조하세요.

아래 스크린샷은 스크립트로 생성된 CSV를 보여줍니다...

PowerShell로 Get-Process 오류를 잡는 방법 캐치 시도 성명

존재하지 않는 프로세스 ID로 Get-Process 명령을 실행하면 다음을 반환합니다. Microsoft.PowerShell.Commands.ProcessCommandException 오류.

이 특정 유형의 예외를 캡처하려면 아래와 유사한 명령을 실행합니다.

|_+_|

다음은 PowerShell ISE의 ​​스크립트 결과입니다.

또는 아래와 같이 스크립트를 수정하여 사용자 정의 오류 메시지를 정의할 수 있습니다.

|_+_|

이제 스크립트가 사용자 지정 오류 메시지를 반환합니다...

PowerShell로 Get-Mailbox 오류를 잡는 방법 캐치 시도 성명

Office 365 PowerShell에 연결하고 사서함 가져오기 존재하지 않는 사용자에 대해 오류 메시지가 표시됩니다. 일부 사용자는 오류 메시지를 캡처하는 데 문제가 있다고 보고했습니다. 사서함 가져오기 명령.

이 시나리오를 테스트하려면 오피스 365 계정 PowerShell을 통해 아래 스크립트를 실행했습니다.

|_+_| 사용자 Pius는 Office 365 계정에 존재하지 않습니다.

스크립트가 오류 메시지를 반환했습니다. 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM에서 개체 'Pius'를 찾을 수 없기 때문에 작업을 수행할 수 없습니다. '.

다음은 스크린샷입니다...

그러나 만약 캐치 시도 오류를 포착하지 못하면 아래 수정된 명령에 표시된 대로 예외 유형을 추가해 보십시오.

|_+_|

그것이 전부입니다 – PowerShell에 대한 포괄적이고 업데이트된 가이드 캐치 파이널 시도 리! 도움이 되셨나요?

도움이 되셨다면 투표 부탁드립니다 네 이 게시물이 도움이 되었습니까?

또는 이 페이지 끝에 있는 답장 남기기 양식을 사용하여 질문하거나 의견을 남기거나 더 많은 피드백을 제공할 수 있습니다.

마지막으로 더 많은 PowerShell 기술 S 영역을 보려면 Windows PowerShell 방법 가이드 페이지를 방문하세요. Work from Home 페이지가 매우 도움이 될 수도 있습니다.

참조 및 추가 읽을거리

  1. 마지막으로 Catch를 시도하는 정보
  2. 트랩 소개
  3. PowerShell 어레이 및 어레이에 추가: 애플리케이션 및 예
  4. Powershell For 루프 설명: 구문 및 예