2017-07-13 2 views
2

Comment rediriger nePowershell stderr et stdout redirect à deux endroits différents

  • stderr à logfile
  • stdout pour objet

choses que j'ai regardé:

>> et 2>> redirige uniquement vers le fichier.
-RedirectStandardOutput et -RedirectStandardError uniquement rediriger vers le fichier à nouveau.
| Out-File ne peut pas rediriger stderr.
| Tee-Object même numéro.

+3

'. {$ object = commande} 2> & 1 | Fichier de journalisation hors fichier – PetSerAl

+0

@PetSerAl - pouvez-vous expliquer cela? '2> 1' redirigerait les deux sorties stdout et stderr vers le fichier journal, n'est-ce pas? –

+1

Oui. Mais l'opération d'affectation ('$ object =') capture déjà la sortie normale, elle est donc déjà supprimée des flux de sortie à ce moment-là. –

Répondre

6

En joignant stdout et stderr des flux de sortie fonctionne comme PetSerAl commenté, même si la syntaxe n'est pas la plus intuitive.

La syntaxe de weirdish 2>&1 signifie que stderr (courant 2) doit être ajouté dans le stdout (flux 1). Comme ce n'est pas vraiment ce que vous recherchez, essayez d'adapter l'autre exemple de la page MS à Powershell:

Ou, vous pouvez rediriger la sortie à un endroit, et les erreurs à un autre.

dir file.xxx> output.msg 2> output.err

Ainsi,

$ret = myCommand 2> errors.log 

devrait envoyer des erreurs dans un fichier journal et non des erreurs dans la variable $ret.

+0

Merci vonPryz. Un des gros problèmes que je rencontre avec powershell n'est pas de trouver de la documentation sur quoi faire, mais "pourquoi" et "comment" les choses fonctionnent. Savoir que 2> & 1 stderr dans stdout est la clé. –

2

Une explication complète dans about_Redirection article MSDN.

A Minimal, Complete, and Verifiable example (stdout à tuyau):

PS D:\PShell> -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Output 
-15 
3 
7.5 

PS D:\PShell> Get-Content "$env:temp\err.txt" 
Attempted to divide by zero. 
At line:1 char:28 
+ -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Outpu ... 
+       ~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], RuntimeException 
    + FullyQualifiedErrorId : RuntimeException 


PS D:\PShell> 

Un autre exemple (stdout à objecter):

PS D:\PShell> $x = -1,5,0,2| ForEach-Object { 15/$_} 2>"$env:temp\err.txt" 

PS D:\PShell> $x 
-15 
3 
7.5