web-dev-qa-db-fra.com

Comment rediriger la sortie d'un PowerShell vers un fichier lors de 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é. Donc je ne peux pas faire:

 .\MyScript.ps1 > output.txt

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

180
Martin

Peut-être que 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 lorsque vous avez terminé.

 $ ErrorActionPreference = "SilentlyContinue" 
 Stop-Transcript | out-null 
 $ ErrorActionPreference = "Continuer" 
 Chemin de transcription-début C:\output.txt -append 
 # Faire des choses 
 Stop-Transcript 

Vous pouvez également le faire fonctionner pendant que vous travaillez sur des choses et le sauvegarder en sauvegardant vos sessions en ligne de commande pour une référence ultérieure.

Si vous souhaitez supprimer complètement l'erreur lorsque vous essayez 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"
173
Bratch

Microsoft a annoncé sur le site Web Connections de Powershell (2012-02-15 à 16:40) que, dans la version 3.0, la redirection a été étendue pour résoudre 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

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

help about_Redirection
46
Nathan Hartley

Utilisation:

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

Une solution possible, si votre situation le permet:

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

    .\TheRealMyScript.ps1> output.txt

24
zdan

Je suppose que vous pouvez modifier MyScript.ps1. Ensuite, essayez de le changer comme suit:

$(
    Here is your current script
) *>&1 > output.txt

Je viens d’essayer cela avec PowerShell 3. Vous pouvez utiliser toutes les options de redirection comme dans réponse de Nathan Hartley .

23
Michael Lemke

Vous voudrez peut-être jeter un coup d'œil à la cmdlet Tee-Object . Vous pouvez diriger la sortie vers Tee et il va écrire dans le pipeline et également dans un fichier

17
Andy Schneider
powershell ".\MyScript.ps1" > test.log
15
suiwenfeng

Si vous voulez une redirection directe de toutes les sorties vers un fichier, essayez d'utiliser *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Comme il s’agit d’une redirection directe vers un fichier, elle ne sera pas sortie vers la console (souvent utile). Si vous voulez la sortie de la console, combinez toutes les sorties avec *&>1, puis dirigez avec Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Je pense que ces techniques sont prises en charge dans PowerShell 3.0 ou version ultérieure; Je teste sur PowerShell 5.0.

9
sonjz

Si vous souhaitez le faire à partir de la ligne de commande et non intégré au script, utilisez:

.\myscript.ps1 | Out-File c:\output.csv
4
Chris

Pour intégrer cela dans votre script, vous pouvez le faire comme ceci:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Cela devrait faire l'affaire.

0
bbcompent1