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?
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"
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
Utilisation:
Write "Stuff to write" | Out-File Outputfile.txt -Append
Une solution possible, si votre situation le permet:
Créez un nouveau fichier MyScript.ps1 qui ressemble à ceci:
.\TheRealMyScript.ps1> output.txt
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 .
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
powershell ".\MyScript.ps1" > test.log
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.
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
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.