Reindirizzare l'errore standard a una variabile in PowerShell


16

Vorrei scrivere un test di dcdiag per avvisarmi se rileva errori. Pensavo di poterlo fare in PowerShell da ...

$test = dcdiag 2>$err

Al momento non ho errori da dcdiag, quindi non ho potuto testarlo direttamente, ma ho scritto un altro script PowerShell per generare un'eccezione, sperando di poter testare questo metodo usando quello script. Questo non ha funzionato utilizzando il metodo sopra, quindi ho optato per:

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

Ha funzionato per il mio caso di test, ma non so se questo rileverà l'errore standard da dcdiag.

Come dovrei ottenere il reindirizzamento degli errori standard a una variabile in PowerShell dato che vorrei usarlo con dcdiag?

Risposte:


18

try...catch non sarebbe d'aiuto in questo caso.

Potresti voler fare:

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

3
Ah, non ho detto nella domanda originale; è possibile mantenere sia stdout che stderr? cioè $ test = stdout e $ err = stderr?
Ablue,

2
@Ablue - $testavrà entrambi, ecco perché sto filtrando l'errore $err.
manojlds,

1
Assicurati che $ ErrorActionPreference non sia impostato su "SilentlyContinue". Quando è il flusso di errori non è disponibile.
cmcginty,

@cmcginty effettivamente $ ErrorActionPreference dovrebbe essere impostato su "Continua". L'uso di SilentlyContinue catturerà lo stdout solo perché lo stderr sarà completamente rimosso (almeno su PowerShell 5)
Simon Bergot

2
@Simon Corretto, ho detto di NON usare SilentlyContinue.
cmcginty
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.