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
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.
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
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é!