PowerShell에서 표준 오류를 변수로 리디렉션


16

dcdiag 테스트를 스크립트하여 오류가 발견되면 알려주십시오. PowerShell 에서이 작업을 수행 할 수 있다고 생각했습니다 ...

$test = dcdiag 2>$err

현재 dcdiag에서 오류가 없으므로 직접 테스트 할 수는 없었지만 예외를 발생시키는 다른 PowerShell 스크립트를 작성하여 해당 스크립트를 사용 하여이 방법을 테스트 할 수 있기를 바랍니다. 위의 방법으로는 작동하지 않으므로 다음을 선택했습니다.

try {
    $test = dcdiag
}
catch { 
    $err = $_.Exception.Message
}

테스트 사례에서 효과가 있었지만 이것이 dcdiag에서 표준 오류를 가져올 지 모르겠습니다.

dcdiag와 함께 사용하려는 경우 PowerShell에서 변수로 표준 오류 리디렉션을 가장 잘 수행하려면 어떻게해야합니까?

답변:


18

try...catch 이 경우 도움이되지 않습니다.

당신은 할 수 있습니다 :

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}

3
아, 나는 원래 질문에서 말하지 않았다. stdout과 stderr을 모두 유지할 수 있습니까? 즉 $ test = stdout 및 $ err = stderr?
Ablue

2
@Ablue- $test둘 다 가질 것이므로 오류를 필터링합니다 $err.
manojlds

1
$ ErrorActionPreference가 "SilentlyContinue"로 설정되어 있지 않은지 확인하십시오. 오류가 발생하면 스트림을 사용할 수 없습니다.
cmcginty

@cmcginty 실제로 $ ErrorActionPreference는 "Continue"로 설정해야합니다. SilentlyContinue를 사용하면 stderr가 완전히 제거되므로 stdout 만 캡처합니다 (최소한
Powershell

2
@Simon Correct, SilentlyContinue를 사용하지 마십시오.
cmcginty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.