263 votes

Comment rediriger la sortie d'un PowerShell vers un fichier pendant son exécution ?

J'ai un script PowerShell pour lequel je voudrais rediriger la sortie vers un fichier. Le problème est que je ne peux pas changer la façon dont ce script est appelé. Je ne peux donc pas le faire :

 .\MyScript.ps1 > output.txt

Comment rediriger la sortie d'un script PowerShell pendant son exécution ?

0 votes

Comme @Nathan le mentionne dans sa réponse, si vous utilisez Powershell 3.0 ou supérieur, cela devrait fonctionner. Vérifiez ceci : stackoverflow.com/a/2916392/3197387

246voto

Bratch Points 1531

Peut-être Start-Transcript fonctionnerait pour vous. Arrêtez-le d'abord s'il est déjà en marche, puis démarrez-le, et arrêtez-le une fois terminé.

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path C:\\output.txt -append
# Do some stuff
Stop-Transcript

Vous pouvez également l'utiliser pendant que vous travaillez et enregistrer vos sessions de ligne de commande pour vous y référer ultérieurement.

Si vous voulez supprimer complètement l'erreur lorsque vous tentez d'arrêter une transcription qui n'est pas en cours de transcription, vous pouvez procéder comme suit :

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

15 votes

Notez que start-transcript n'enregistre pas Write-Error, Write-Verbose, ou Write-Debug... seulement la sortie standard.

7 votes

@richard : il semble que ce soit le cas maintenant. Il s'agit peut-être d'un ajout à la version 2.0, je ne suis pas sûr que ces réponses s'appliquent toutes à la version 1.0.

0 votes

J'utilise presque le même code que ci-dessus. Mon problème est que Stop-Transcript |out-null envoie toujours un message d'erreur si la transcription n'est pas lancée. J'ai besoin de supprimer ce message car il perturbe ma mise en page. L'option -erroraction silentlycontinue ne m'aide pas non plus. Des idées ?

67voto

Nathan Hartley Points 1115

Microsoft a annoncé sur le site web de Powershell's Connections (2012-02-15 at 4:40 PM) que dans la version 3.0 ils ont étendu la redirection comme solution à ce problème.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Consultez l'article d'aide "about_Redirection" pour plus de détails et d'exemples.

help about_Redirection

1 votes

Je ne dis pas que j'aime cette solution. En fait, je la trouve laide, difficile à retenir et peu flexible. Il semble que l'ajout de paramètres de capture de flux aux Cmdlets Out-*, Set-Content et Add-Content aurait fait l'affaire de manière plus efficace. Tant qu'ils y sont, ils devraient également ajouter un paramètre -PassThru. Ce qui rendrait effectivement obsolète la Cmdlet Tee-Object, moins qu'utile.

0 votes

Je suis confus, en quoi cela répond-il à la question posée ? "Comment puis-je rediriger la sortie d'un script PowerShell pendant son exécution" ?

0 votes

Vous avez raison, @Zoredache, il semble que j'ai négligé l'exigence "ne peut pas changer la façon dont ce script est appelé". Pour capturer la majorité de la sortie, Start-Transcript est la solution. Dois-je supprimer cette réponse ?

60voto

Fred Points 71

Utilisez :

Write "Stuff to write" | Out-File Outputfile.txt -Append

5 votes

Ne résout pas la question de l'OP car elle ne fonctionne pas "pendant l'exécution". Mais je lui ai donné +1 car il est utile de savoir comment faire du pipeing dans Powershell de toute façon.

0 votes

Cela tronque les longues lignes de sortie et supprime les informations

27voto

zdan Points 11822

Une solution possible, si votre situation le permet :

  1. Renommez MyScript.ps1 en TheRealMyScript.ps1
  2. Créez un nouveau MyScript.ps1 qui ressemble à :

    . \TheRealMyScript.ps1 > output.txt

17voto

Andy Schneider Points 4118

Vous pourriez vouloir jeter un coup d'œil à la cmdlet Tee-Object . Vous pouvez envoyer la sortie à Tee et il écrira dans le pipeline et aussi dans un fichier.

2 votes

"output" | Set-Content -PassThru et "output" | Add-Content -PassThru fonctionneront également comme Tee-Object, avec l'avantage supplémentaire de pouvoir définir l'encodage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X