2012-09-21 4 views
8

에게 PowerShell 콘솔 및 PowerShell을 ISE 실행 파일은 표준 오류 스트림 (stderr)에 쓸 때 다르게 행동을 표준 에러를 보내지 않도록 PowerShell을 ISE에게. 콘솔 (powershell.exe)은 표준 출력처럼 표시합니다.쓰기 오류로

> hg st -R C:\Windows 
abort: repository C:\Windows not found! 

그러나, PowerShell을 ISE에서 (powershell_ise.exe), 그 오류가 PowerShell에서의 Write-Error cmdlet으로 전달되는 : : '비 저장소에 의욕이있는 상태를 얻을 때 예를 들어, 표준 오류에 기록

> hg st -R C:\Windows 
hg.exe : abort: repository C:\Windows not found! 
At line:1 char:3 
+ hg <<<< st -R C:\Windows 
    + CategoryInfo   : NotSpecified: (abort: repository C:\Windows not found!:String) [], RemoteExcepti 
    on 
    + FullyQualifiedErrorId : NativeCommandError 

ISE가 콘솔처럼 동작하고 stderr 스트림을 Write-Error으로 보내지 않도록 설정할 수있는 방법이 있습니까?

+0

내가 현재 Win7에 내 파워 쉘 4로보고 있어요 즉 예를 들어'powershell script.ps1'을 호출합니다. 일반 cmd 창이면 stderr 스트림은 ISE에서와 같이 동작합니다. 즉 Write-Error를 사용합니다. –

답변

1
hg st -R C:\Windows 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_.Exception.Message } else { $_ } } 

이렇게하면 stderr 출력이 보존되어 삭제되는 대신 정상 출력으로 전송됩니다. 콘솔에서 .ps1` PowerShell은 스크립트를`실행할 때 * 파워 쉘 콘솔 및 ISE는 * 설명 된 방식으로 행동하지만 않거나, 때

7

"해야한다"작업을 표준 출력하기 위해 표준 에러 출력을 리디렉션하지만 ISE하지 않습니다. 이 경우, 가장 좋은 건과 같이 오류 출력을 침묵하는 것입니다

& { 
    $ErrorActionPreference = 'SilentlyContinue' 
    hg st -R C:\Windows 2>&1 
} 

중첩 범위에이 변수를 설정 실행하여 전 세계적으로 설정하지 마십시오. 위의 범위가 종료되면, $ErrorActionPreference글로벌 버전은 여전히 ​​예전 무엇으로 설정되어 있습니다.

는 ISE와 콘솔이 다르게 행동하는 것이 불행한 일이다하지만 "콘솔"로, 다른 콘솔 응용 프로그램이 너무 이 (PowerShell을 우회) 콘솔에 직접 출력되는 콘솔 핸들을 얻는 것이 나의 이해이다. ISE는 콘솔 기반이 아니므로 PowerShell 오류 스트림으로 기본 stderr을 멋지게 재생하려고합니다. 이 경우 IMO 콘솔의 동작이 이상적이지 않습니다. 그래서 ISE는 (스트림 리디렉션을 존중하지에 대한 비트 제외) ISE 열려진 더 나은 처리 가질 콘솔 또는 더 나은과 일치해야하는 것이 좋습니다? 분명히 PowerShell은 후자와 함께갔습니다.

+0

이것은 작동하지 않습니다. 여전히'Write-Error'를 사용하여 오류를 씁니다. –

+0

@splatteredbits 그래, 아직도 않습니다. 내 대답을 업데이트하여 다른 옵션을 제공했습니다. –

+0

감사합니다. 실험 반나절 후,이 접근법은 확실한 승자로 판명되었습니다. 단점이 있지만 전반적으로, 나는 그것이 필요한 것을 위해 일한다. – Sander