Redirecionar erro padrão para uma variável no PowerShell

16

Gostaria de criar um script dcdiag para me alertar se encontrar algum erro. Eu pensei que poderia fazer isso no PowerShell ...

$test = dcdiag 2>$err

Não tenho nenhum erro do dcdiag no momento, então não pude testá-lo diretamente, mas escrevi outro script do PowerShell para lançar uma exceção, esperando poder testar esse método usando esse script. Como não funcionou usando o método acima, optei por:

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

Funcionou no meu caso de teste, mas não sei se isso detectará um erro padrão no dcdiag.

Como devo obter melhor redirecionamento de erro padrão para uma variável no PowerShell, pois gostaria de usá-lo com o dcdiag?

Um azul
fonte

Respostas:

18

try...catch não ajudaria neste caso.

Você pode querer fazer:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}
manojlds
fonte
3
Ah, eu não disse na pergunta original; é possível manter stdout e stderr? ou seja, $ test = stdout e $ err = stderr?
ablue
2
@ Ablue - $testterá ambos, é por isso que estou filtrando o erro para $err.
Manojlds
11
Verifique se $ ErrorActionPreference não está definido como "SilentlyContinue". Quando é que o fluxo de erros não está disponível.
cmcginty
@cmcginty atualmente $ ErrorActionPreference deve ser definido como "Continuar". Usando SilentlyContinue só saída padrão de captura como stderr vai ser completamente removida (pelo menos em powershell 5)
Simon Bergot
2
@ Simon Correto, eu disse NÃO use o SilentlyContinue.
cmcginty