예를 들어 내 PowerShell 스크립트가 존재하지 않는 서버 (제 경우 "bla")에 대한 SQL Server 개체를 만들려고하면 PowerShell은 많은 PowerShell 오류를 빨간색으로 표시합니다.
내 스크립트는 $?
이러한 호출 후의 값을 확인하고 오류를 표시 및 기록하기 때문에 여러 줄의 PowerShell 오류도 표시하지 않는 것이 좋습니다.
내 스크립트에 표시되는 항목을 비활성화하려면 어떻게해야합니까?
답변:
몇 가지 옵션이 있습니다. 가장 쉬운 방법은 ErrorAction
설정을 사용하는 것 입니다.
-Erroraction
모든 cmdlet에 대한 범용 매개 변수입니다. 무시하고 싶은 특별한 명령이 있으면 -erroraction 'silentlycontinue'
기본적으로 해당 명령에 의해 생성 된 모든 오류 메시지를 무시하는 명령을 사용할 수 있습니다 . Ignore
값 (PowerShell 3 이상)을 사용할 수도 있습니다 .
SilentlyContinue와 달리 Ignore는 $ Error 자동 변수에 오류 메시지를 추가하지 않습니다.
스크립트의 모든 오류를 무시하려면 시스템 변수를 사용 $ErrorActionPreference
하고 동일한 작업을 수행 할 수 있습니다 .$ErrorActionPreference= 'silentlycontinue'
-ErrorAction에 대한 자세한 정보는 about_CommonParameters 를 참조 하십시오 . $ ErrorActionPreference에 대한 자세한 내용은 about_preference_variables 를 참조하세요 .
-ErrorAction:SilentlyContinue
PS 5.1 로 포맷해야했습니다 . 일괄 처리에서 내 cmdlet을 호출 했으므로 차이가 있는지 알 수 없습니다. 그러나 허용 가능한 오류를 알고 있으면 좋은 정보가 발생할 수 있습니다.
Windows PowerShell은 오류보고를위한 두 가지 메커니즘, 즉 오류를 종료하는 메커니즘과 종료 되지 않는 오류에 대한 메커니즘을 제공합니다 .
내부 CmdLets 코드는 ThrowTerminatingError
cmdlet이 입력 개체를 계속 처리하도록 허용하지 않거나 허용하지 않는 오류가 발생 하면 메서드 를 호출 할 수 있습니다 . 스크립트 작성자는 예외를 사용하여 이러한 오류를 포착 할 수 있습니다.
예 :
try
{
Your database code
}
catch
{
Error reporting/logging
}
내부 CmdLets 코드는 WriteError
cmdlet이 입력 개체 처리를 계속할 수있는 경우 종료되지 않는 오류를보고 하는 메서드를 호출 할 수 있습니다. 그런 다음 스크립트 작성자는 -ErrorAction 옵션을 사용하여 메시지를 숨기거나를 사용 $ErrorActionPreference
하여 전체 스크립트 동작을 설정할 수 있습니다.
여기서 길을 벗어났습니다.
이미 훌륭하고 큰 오류 메시지가 있습니다. 왜 지구상에서 매 명령$?
후에 명시 적으로 확인하는 코드를 작성하고 싶 습니까? 이것은 매우 번거롭고 오류가 발생하기 쉽습니다. 올바른 해결책은 검사를 중지하는 것 입니다.$?
대신 PowerShell의 기본 제공 메커니즘을 사용하여 폭파하십시오. 오류 기본 설정 을 최고 수준 으로 설정하여 활성화합니다 .
$ErrorActionPreference = 'Stop'
나는 이것을 내가 작성한 모든 스크립트의 맨 위에 놓았으며 이제 $?
. 이것은 내 코드를 훨씬 더 간단하고 안정적으로 만듭니다.
이 동작 을 실제로 비활성화해야하는 상황 이 catch
발생하면 오류를 발생 시키거나 common을 사용하여 특정 기능에 설정을 전달할 수 있습니다 -ErrorAction
. 귀하의 경우에는 프로세스가 첫 번째 오류에서 중지하고 오류를 포착 한 다음 기록하기를 원할 것입니다.
이것은 외부 실행 파일이 실패하는 경우를 처리하지 않습니다 (일반적으로 종료 코드가 0이 아님). 따라서 $LASTEXITCODE
호출 여부 를 확인해야 합니다. 이러한 제한에도 불구하고이 설정은 여전히 많은 코드와 노력을 절약합니다.
엄격 모드 사용을 고려할 수도 있습니다 .
Set-StrictMode -Version Latest
이렇게하면 존재하지 않는 변수를 사용할 때와 다른 이상한 상황에서 PowerShell이 자동으로 진행되지 않습니다. ( -Version
제한 사항에 대한 자세한 내용은 매개 변수를 참조하십시오 .)
이 두 가지 설정을 결합하면 PowerShell이 훨씬 더 빠르고 빠른 언어가되어 프로그래밍이 훨씬 쉬워집니다.
cmdlet에 대한 powershell 오류 메시지를 표시하지 않고 계속 오류를 포착하려면 "-erroraction 'silentlyStop'"을 사용합니다.
New-Item -ItemType directory
(PowerShell을 2.0)