2011-03-10 2 views
13

Powershell의 Write-Error cmdlet이 저에게 맞지 않는 이유는 무엇입니까?쓰기 오류를 사용하여 Powershell의 오류 스트림에 쓰기

PS C:\> Write-Error "This is an error" 
Write-Error "This is an error" : This is an error 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 
나는 비슷한 출력을 기대했다

Write-Warning에 : 나는 예외를 참조하지 않아야 생각 Write-Errorabout_preference_variables 문서에서

PS H:\> Write-Warning "This is a warning" 
WARNING: This is a warning 

내 출력 문서의 예제처럼 보이지 않는 ?

PS H:\> Get-Help About_Preference_Variables 

$ErrorActionPreference 
---------------------- 

... 

     PS> $erroractionpreference      
     Continue  # Display the value of the preference.     

     PS> write-error "Hello, World"     
           # Generate a non-terminating error. 

     write-error "Hello, World" : Hello, World  
           # The error message is displayed and 
            execution continues. 

     PS> write-error "Hello, World" -ErrorAction:SilentlyContinue 
           # Use the ErrorAction parameter with a 
            value of "SilentlyContinue". 
     PS>            
           # The error message is not displayed and 
            execution continues. 
+0

당신이 출력에서 ​​볼 무엇을 기대합니까? 네가 올린 글은 내게 완벽하게 정상적으로 보인다. –

+1

@zespri 필자는 Write-Warning과 비슷한 것을 기대하고 있었지만, 예제를 포함하도록 질문을 편집했습니다. –

+2

보고있는 출력이 정확합니다. 출력이 v2.0 IIRC로 변경되어 좀 더 자세한 정보가 표시됩니다. 처음 발생한 문서가 아닌 문서가 잘못되었습니다. :-) –

답변

14

이-경고를 쓸 유사한 출력을 얻으려면, 당신이 할 수 있습니다 :

$Host.UI.WriteErrorLine("This is an error") 

(이 답변 크리스 시어스에 소품)

+0

위대한! 이것은 나를 위해 확실히 유용합니다. –

+2

흥미롭게도 이것은 stderr가 아니라 stdout에 씁니다. PowerShell ISE는 정상적인 PowerShell 프롬프트에서 (특수 서식이 적용되지 않은 경우에도) 나타나지만 나타나지 않습니다. '[System.Console] :: Error.WriteLine ('test')'를 각각 실행 해보고 무슨 일이 일어나는 지보십시오. – Zenexer

+2

이 작업을 수행하지 마십시오. 'WriteErrorLine'은 UI 메소드입니다. Zenexer는 아무것도 stderr로 리디렉션되지 않는다고 말합니다. Keith Hill의 대답과 http://stackoverflow.com/questions/4998173/how-do-i-write-to-standard-error-in-powershell을 참조하십시오. –

2

나는 그 cmdlet의 예상 출력을보고 있습니다. '액세스가 거부되었습니다.'라고 입력하고 있습니다. 인수로 출력하고 호스트로 출력하고 설계된대로 오류 스트림을 출력 할 가능성이 큽니다. $ Error 변수로 출력되고 있는지 확인하고 방금 삽입 한 오류로 채워 져야합니다.

PS C:\> $error.Clear() 

PS C:\> Write-Error "access denied" 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS C:\> $error 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

그 그래도 혼란 스러울 것이다 어디 아마도 MSFT는 명확성을 위해이 "는 foobar" "액세스가 거부되었습니다"같은에서 예를 들어 오류를 변경해야 볼 수 있습니다.

추가 질문에 대한 답변 : 쓰기 오류에 대한 기본 errorAction은 "계속"이므로 Write-Warning처럼 작동하도록하려면 -ErrorAction SilentlyContinue를 추가해야합니다. 다음 예제를 고려하십시오.

PS E:\> $error.clear() 
PS E:\> Write-Error 'test' 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> Write-Error 'test2' -ErrorAction silentlycontinue 

PS E:\> $error[1] 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> $error[0] 
Write-Error 'test2' -ErrorAction silentlycontinue : test2 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 
+0

"CategoryInfo가 지정되지 않았습니다"라는 WriteErrorException이 나타나는 이유는 무엇입니까? 설명서에 선택 사항이라고 나와 있습니다 ... –

+0

카테고리 정보가 지정되지 않았 음을 표시합니다.보고있는 내용은 표준 오류 출력이며 Write-Error는 내용입니다. 오류가 PS로 발생 될 때 템플릿 ... 일례를 표시한다 : 1 개 문자 : 7 + LKAS 라인에서 를 인식하지 'LKAS' 용어 LKAS \> PS E를 code' ' <<<< + CategoryInfo : ObjectNotFound : (lkasjd : 문자열) [], CommandNotFoundException + FullyQualifiedErrorId : 는'카테고리 정보가 항상 표시됩니다 code' CommandNotFoundException; Write-Error 명령으로 명시 적으로 지정하지 않았으므로 지정되지 않은 것으로 나타납니다. –

+0

죄송합니다, 나는 거기에 미니 markdown를 망 쳤어. 질문의 추가 범위를 다루기 위해 원래 게시물을 편집했습니다. 엉망으로 미안 해요 :) –

5

왜 작동한다고 생각하지 않습니까? PowerShell은 위와 같은 종결되지 않는 오류와 throw 'Access denied.'을 실행할 때 얻는 것처럼 종료되는 오류를 구분합니다. 비 종료 오류는 stderr에 기록되고 $ error 콜렉션에 기록되지만 스크립트 처리가 중지되지는 않습니다. 이 기능은 여러 파일을 처리 (말하기 또는 복사) 할 때 매우 편리합니다. 어떤 파일을 처리 할 수 ​​있는지 알고 싶지만 오류가있는 첫 번째 파일에서 전체 작업을 중단하지 않으려합니다.

PowerShell은 종결되지 않는 오류를 종결 오류로 "변환"하는 옵션도 제공합니다.

Remove-Item c:\file-doesnt-exist -ErrorAction Stop; "Did I get here" 

이 경우 실행이 중지되고 마지막에 문자열이 인쇄되지 않습니다. -ErrorAction Stop없이 시도하면 오류가 표시되지만 "여기에 왔습니까?"라는 문자열도 표시됩니다. 당신은 당신이 그렇게처럼 - 종류 매개 변수를 사용할 수있는 Catogory 정보를 제어하려면

:

PS> write-error "foo" -Category 'InvalidResult' 
write-error "foo" -Category 'InvalidResult' : foo 
    + CategoryInfo   : InvalidResult: (:) [Write-Error], WriteErrorExce.. 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

을하지만 WriteErrorException이 메커니즘하는이 cmdlet이 오류가 발생합니다 (나는 생각한다). Exception 매개 변수가 있지만 많이 사용하지 않았습니다.