web-dev-qa-db-fra.com

Erreurs d'écriture et sortie dans un fichier texte et une console

J'essaie d'écrire la sortie entière (erreurs incluses) d'un script en cours d'exécution sur la console et un fichier en même temps. J'ai essayé plusieurs options différentes:

.\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 

J'espérais pouvoir utiliser le fichier pour revoir la sortie/les erreurs.

ÉDITER:

Ceci est mon script de test actuel. Le résultat souhaité est 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
26
smaclell

As-tu essayé:

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

2>&1 est ce que vous cherchez

Remarque: cette réponse fonctionne très bien dans PowerShell 1.0 et 2.0, mais ne capturera QUE la sortie standard et les erreurs dans PowerShell 3.0 et versions ultérieures.

22
David Gladfelter

Je n'étais pas satisfait de la réponse que je trouvais, alors j'en ai mélangé quelques-unes et j'ai trouvé ceci (dans PowerShell 3.0 +):

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

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

Il intercepte 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 intercepte 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 intercepte la sortie s'il n'y a eu aucun problème avec votre commande:

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 aussi pour votre exemple:

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
6
jdgregson

Je n'ai pas pu obtenir les erreurs et les résultats dans le même fichier. Une solution de contournement qui a fonctionné pour moi:

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

Mise à jour: j'ai encore travaillé et j'ai utilisé Start-Transcript et Stop-Transcript dans mon mode pour tout capturer et ça a marché!

1
user1096785

Par défaut, seul le flux de données Success est transmis au fichier de sortie. Pour diriger les erreurs et les avertissements, vous devrez ajouter quelque chose comme ceci:

votre script 3> & 1 2> & 1 | Log.txt hors fichier

Powershell redirection operators.

0
Ramakant Dadhichi