2010-06-09 6 views
22

J'essaye d'écrire la sortie complète (erreurs incluses) d'un script en cours d'exécution sur la console et un fichier en même temps. J'ai essayé plusieurs différentes options:Ecriture des erreurs et sortie vers un fichier texte et une console

.\MyScript.ps1 | tee -filePath C:\results.txt # only the output to the file 
.\MyScript.ps1 2> C:\results.txt # only the errors to the file and not the console 
.\MyScript.ps1 > C:\results.txt # only the output to the file and not the console 

Mon espoir était que je pourrais employer le dossier pour examiner le rendement/erreurs.

EDIT:

Ceci est mon script de test en cours. Les résultats souhaités sont que les trois messages peuvent être vus.

function Test-Error 
{ 
    echo "echo" 
    Write-Warning "warning" 
    Write-Error "error"  
} 

Test-Error 2>&1 | tee -filePath c:\results.txt 
+0

@JasonMArcher merci de mettre à jour les tags sur cette question! Y a-t-il quelque chose de plus que nous devrions faire puisqu'il est fixé en V3 et que j'utilisais à l'origine V2? Merci. – smaclell

+0

Cela dépend, voulez-vous seulement des réponses à V2? Ce n'est pas un problème spécifique à V2. Ainsi, la meilleure idée est de préférer les réponses réelles à la version de PowerShell à laquelle elles sont destinées. :) – JasonMArcher

+1

J'ai ajouté quelques notes aux réponses existantes sur la compatibilité de la version PS. – JasonMArcher

Répondre

19

Avez-vous essayé:

.\MyScript.ps1 2>&1 | tee -filePath c:\results.txt 

2>&1 est ce que vous cherchez

Note: Cette réponse fonctionne très bien dans PowerShell 1.0 et 2.0, mais capturer uniquement la sortie standard et erreurs dans PowerShell 3.0 et versions ultérieures.

+0

Ceci est très proche. J'ai ajouté le script que j'utilise pour tester la fonctionnalité souhaitée à la question. Il est capable d'obtenir la sortie standard et les erreurs mais pas les avertissements. D'autres idées? – smaclell

+1

Vous n'avez pas beaucoup de bonnes options pour cela. Lisez les rubriques d'aide de la cmdlet pour WRite-Warning et Write-Error et vous verrez qu'ils sont fondamentalement différents. Write-Warning écrit sur l'hôte, Write-Error écrit dans le flux de sortie d'erreur. Vous pouvez rediriger les flux, mais écrire à l'hôte va à l'hôte. Votre seule alternative est la WarningVariable, etc paramètres communs. Vous devriez pouvoir rediriger toutes les données d'avertissement/d'erreur/de sortie vers une variable en utilisant ceci. Voir la rubrique d'aide about_CommonParameters pour plus d'informations. –

+2

BTW, semble que vous n'êtes pas le premier à courir dans ce domaine. Je gars que je travaillais avec a une bonne description du problème ici: http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!6926.entry –

1

Je n'ai pas pu obtenir à la fois des erreurs et des résultats dans le même fichier. Une solution qui a fonctionné pour moi:

.\MyScript.ps1 2> C:\errors.txt | tee -filePath C:\results.txt

Mise à jour: J'ai travaillé plus loin et j'utilisé Start-Transcript et Stop-Transcript dans mon mode pour capturer tout et cela a fonctionné!

+0

L'autre réponse écrit correctement stderr et stdout dans le fichier. Le problème initial n'était pas d'inclure également des avertissements. 'Start-Transcript' et' Stop-Transcript' sont très utiles et valent la peine d'être étudiés. – smaclell

2

Je n'étais pas satisfait une réponse que je découvrais, je mélangé un peu et est venu avec cette (dans PowerShell 3.0+):

$output = try{your_command *>&1}catch{$_} 

Avec cela, vous pouvez capturer toutes les erreurs et sortie qui sont générés en essayant d'utiliser your_command.

Il capture des exceptions lorsque vous utilisez une commande inexistante:

PS C:\Users\jdgregson> $output = try{your_command *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
your_command : The term 'your_command' is not recognized as the name of a 
cmdlet, function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:15 
+ $output = try{your_command 2>&1}catch{$_} 
+    ~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (your_command:String) [], Comman 
    dNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

PS C:\Users\jdgregson> 

Il attrape des exceptions lorsque vous passez des arguments non valides à une commande existante:

PS C:\Users\jdgregson> $output = try{cat C:\invalid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
cat : Cannot find path 'C:\invalid-path.txt' because it does not exist. 
At line:1 char:15 
+ $output = try{cat C:\invalid-path.txt 2>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (C:\invalid-path.txt:String) [Ge 
    t-Content], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetCo 
    ntentCommand 

Et il attrape la sortie en cas de était pas un problème avec votre commande du tout:

PS C:\Users\jdgregson> $output = try{cat C:\valid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
this file is really here 

Cela fonctionne pour votre exemple aussi:

PS C:\Users\jdgregson> $output = try{Test-Error *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
echo 
WARNING: warning 
Test-Error : error 
At line:1 char:15 
+ $output = try{Test-Error *>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorExcep 
    tion 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio 
    n,Test-Error 
+0

C'est amusant! Merci d'avoir partagé. – smaclell

Questions connexes