[powershell] Powershell : 스크립트에 오류가 표시되지 않도록하려면 어떻게해야합니까?

예를 들어 내 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 를 참조하세요 .


답변

Windows PowerShell은 오류보고를위한 두 가지 메커니즘, 즉 오류를 종료하는 메커니즘과 종료 되지 않는 오류에 대한 메커니즘을 제공합니다 .

내부 CmdLets 코드는 ThrowTerminatingErrorcmdlet이 입력 개체를 계속 처리하도록 허용하지 않거나 허용하지 않는 오류가 발생 하면 메서드 를 호출 할 수 있습니다 . 스크립트 작성자는 예외를 사용하여 이러한 오류를 포착 할 수 있습니다.

예 :

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

내부 CmdLets 코드는 WriteErrorcmdlet이 입력 개체 처리를 계속할 수있는 경우 종료되지 않는 오류를보고 하는 메서드를 호출 할 수 있습니다. 그런 다음 스크립트 작성자는 -ErrorAction 옵션을 사용하여 메시지를 숨기거나를 사용 $ErrorActionPreference하여 전체 스크립트 동작을 설정할 수 있습니다.


답변

.NET을 사용하여 호스트 이름을 확인하려고 할 때 비슷한 문제가 발생했습니다 [system.net.dns]. IP가 해결되지 않으면 .Net에서 종료 오류가 발생했습니다. 종료 오류를 방지하고 여전히 출력 제어를 유지하기 위해 TRAP.

EG

Function Get-IP
{PARAM   ([string]$HostName="")
PROCESS {TRAP
             {"" ;continue}
             [system.net.dns]::gethostaddresses($HostName)
        }
}


답변

여기서 길을 벗어났습니다.

이미 훌륭하고 큰 오류 메시지가 있습니다. 왜 지구상에서 매 명령$? 후에 명시 적으로 확인하는 코드를 작성하고 싶 습니까? 이것은 매우 번거롭고 오류가 발생하기 쉽습니다. 올바른 해결책은 검사를 중지하는 것 입니다.$?

대신 PowerShell의 기본 제공 메커니즘을 사용하여 폭파하십시오. 오류 기본 설정 을 최고 수준 으로 설정하여 활성화합니다 .

$ErrorActionPreference = 'Stop'

나는 이것을 내가 작성한 모든 스크립트의 맨 위에 놓았으며 이제 $?. 이것은 내 코드를 훨씬 더 간단하고 안정적으로 만듭니다.

이 동작 을 실제로 비활성화해야하는 상황 이 catch발생하면 오류를 발생 시키거나 common을 사용하여 특정 기능에 설정을 전달할 수 있습니다 -ErrorAction. 귀하의 경우에는 프로세스가 첫 번째 오류에서 중지하고 오류를 포착 한 다음 기록하기를 원할 것입니다.

이것은 외부 실행 파일이 실패하는 경우를 처리하지 않습니다 (일반적으로 종료 코드가 0이 아님). 따라서 $LASTEXITCODE호출 여부 를 확인해야 합니다. 이러한 제한에도 불구하고이 설정은 여전히 ​​많은 코드와 노력을 절약합니다.

추가적인 신뢰성

엄격 모드 사용을 고려할 수도 있습니다 .

Set-StrictMode -Version Latest

이렇게하면 존재하지 않는 변수를 사용할 때와 다른 이상한 상황에서 PowerShell이 ​​자동으로 진행되지 않습니다. ( -Version제한 사항에 대한 자세한 내용은 매개 변수를 참조하십시오 .)

이 두 가지 설정을 결합하면 PowerShell이 ​​훨씬 더 빠르고 빠른 언어가되어 프로그래밍이 훨씬 쉬워집니다.


답변

-ErrorAction SilentlyContinue스크립트에 추가 하면 잘 될 것입니다.


답변

어떤 경우에는 Out-Null 명령 뒤에 파이프 할 수 있습니다.

command | Out-Null


답변

cmdlet에 대한 powershell 오류 메시지를 표시하지 않고 계속 오류를 포착하려면 “-erroraction ‘silentlyStop'”을 사용합니다.