2017-01-25 3 views
0

cmdlet Write-Error을 호출하는 간단한 로그 함수를 코딩했습니다. 그러나 이로 인해 예기치 않은 동작이 발생합니다.PowerShell 쓰기 오류

function foo { 
    Param([string]$Msg = "This is an error") 
    Write-Error $Msg 
} 

는 다음 foo 결과를 호출 : 당신에게 예를 제공하기 위해 그래서

foo: This is an error 
At line:1 char:1 
+ foo

를, foo를 호출 (과하면 cmdlet을 거기에 Write-Error가)에서 오류가 발생 것 같다 그에게 PS 링크 기능 foo 자체.

PS 오류 스트림에 메시지를 쓰는 올바른 방법은 무엇입니까?하지만 호출 기능에서 오류처럼 보이지는 않습니까?

답변을 찾았습니다. 차이점은 약간 미묘합니다 : 오류를 던지고 오류 메시지를 표준 오류 스트림으로 출력하는 것과는 차이가 있습니다. try/catch 구조에서 오류가 발생하면 catch 블록으로 건너 뜁니다. try 블록에서 write-error을 사용하는 동안 출력을 표준 오류 스트림으로 파이프합니다. 다음 함수는 catch 블록으로 들어 가지 않습니다. 그러나 $ error 변수에 "Hey"라는 오류 메시지를 기록하고 다른 모든 속성은 비워 둡니다.

function myErr { try { write-error "Hey" } catch { write-host "Ups" } } 

오류 메시지는, 그러나, 오류가 1 호선, 1

그래서 좋아, 내가 write-error를 호출 할 때이 표준 행동 것 같다 참조 문자에 myErr 발생한 것을 보여줍니다. 그러면 write-output을 사용합니다. 대신이의

+0

Ehhh,이 오류는 기능에 의해 발생했는데 왜 오류 출력 상태가되지 않습니까? –

+0

오류 처리를 위해 try/catch 구조를 사용해보십시오. –

+0

이것이 바로'Write-Error'가 작동하는 방식입니다. 원하지 않는다면'Write-Output'을 사용하십시오. –

답변

0

: 그것을 위해

function foo { 
    Param([string]$Msg = "This is an error") 
    Write-Error $Msg 
} 

사용 쓰기 출력. 그것은 PS에서 쓰기 오류의 정상적인 동작입니다.

function foo { 
    Param([string]$Msg = "This is an error") 
    Write-Output $Msg 
}