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?

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
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.