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


94

예를 들어 내 PowerShell 스크립트가 존재하지 않는 서버 (제 경우 "bla")에 대한 SQL Server 개체를 만들려고하면 PowerShell은 많은 PowerShell 오류를 빨간색으로 표시합니다.

내 스크립트는 $?이러한 호출 후의 값을 확인하고 오류를 표시 및 기록하기 때문에 여러 줄의 PowerShell 오류도 표시하지 않는 것이 좋습니다.

내 스크립트에 표시되는 항목을 비활성화하려면 어떻게해야합니까?

답변:


140

몇 가지 옵션이 있습니다. 가장 쉬운 방법은 ErrorAction설정을 사용하는 것 입니다.

-Erroraction모든 cmdlet에 대한 범용 매개 변수입니다. 무시하고 싶은 특별한 명령이 있으면 -erroraction 'silentlycontinue'기본적으로 해당 명령에 의해 생성 된 모든 오류 메시지를 무시하는 명령을 사용할 수 있습니다 . Ignore값 (PowerShell 3 이상)을 사용할 수도 있습니다 .

SilentlyContinue와 달리 Ignore는 $ Error 자동 변수에 오류 메시지를 추가하지 않습니다.

스크립트의 모든 오류를 무시하려면 시스템 변수를 사용 $ErrorActionPreference하고 동일한 작업을 수행 할 수 있습니다 .$ErrorActionPreference= 'silentlycontinue'

-ErrorAction에 대한 자세한 정보는 about_CommonParameters 를 참조 하십시오 . $ ErrorActionPreference에 대한 자세한 내용은 about_preference_variables 를 참조하세요 .


-erroraction 'silentlycontinue'에 작은 따옴표가 필요합니까? Intellisese는 옵션을 표시하고 작은 따옴표를 추가하지 않습니다.
PAS

1
위의 형식이 작동하지 않으면 위에 제공된 링크를 참조하세요. -ErrorAction:SilentlyContinuePS 5.1 로 포맷해야했습니다 . 일괄 처리에서 내 cmdlet을 호출 했으므로 차이가 있는지 알 수 없습니다. 그러나 허용 가능한 오류를 알고 있으면 좋은 정보가 발생할 수 있습니다.
David

--rm. \ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </ code>
Tertius Geldenhuys

18

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

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

예 :

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

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


8

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

EG

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

3

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

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

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

$ErrorActionPreference = 'Stop'

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

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

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

추가적인 신뢰성

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

Set-StrictMode -Version Latest

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

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



2

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

command | Out-Null

-1

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


그러한 조치는 없습니다. 중지 조치가 있지만.
Marvin Dickhaus 2015

사용하는 경우 그러나 그것은 캐치 명령 / 섹션을 사용하여 여전히 빨간색 오류 메시지를 표시 할 수 있도록하고 New-Item -ItemType directory(PowerShell을 2.0)
밀라노 Kerslager

@MilanKerslager는 친절하게 코드 샘플을 보여 주시겠습니까? 나와 다른 모든 사람들은 'SilentlyStop'과 같은 ActionPreference가 없다고 믿기 때문입니다.
FSCKur

나는 Mikkel이 무언 정지 라기보다는 무언 정지를 의미한다고 확신합니다.
John
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.