Comment rediriger la sortie D'un PowerShell vers un fichier lors de son exécution
J'ai un script PowerShell pour laquelle 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 pendant son exécution?
10 réponses
Peut-être que Start-Transcript
fonctionnerait pour vous. D'abord l'arrêter si il est déjà en cours d'exécution, puis le démarrer et l'arrêter lorsque vous avez 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'exécuter tout en travaillant sur des choses et l'enregistrer vos sessions de ligne de commande pour référence ultérieure.
EDIT : Si vous voulez supprimer complètement l'erreur lorsque vous tentez d'arrêter une transcription qui ne transcrit pas, vous pouvez le faire:
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"
Microsoft a annoncé sur le site Web de Powershell Connections (15/02/2012 à 16h40) que dans la version 3.0, ils ont étendu la redirection comme solution à ce problème.
In PS 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 d'exemples.
help about_Redirection
Une solution possible, si votre situation le permet:
- renommez MyScript. ps1 en TheRealMyScript. ps1
-
Créez un nouveau MyScript. ps1 qui ressemble à:
. \ TheRealMyScript. ps1 > sortie.txt
Vous pouvez jeter un oeil à l'applet de commande tee-Object. Vous pouvez diriger la sortie vers Tee et il écrira dans le pipeline et aussi dans un fichier
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 ceci avec Powershell 3. Vous pouvez utiliser toutes les options de redirection comme dans la réponse de Nathan Hartley.
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 sur la console (souvent utile). Si vous désirez la sortie de la console, combiné toutes les sorties avec *&>1
, puis pipe 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 crois que ces techniques sont supportées Powershell 3.0+, je teste sur Powershell 5.0.
.\myscript.ps1 | Out-File c:\output.csv
Si vous voulez le faire à partir de la ligne de commande et non intégré dans le script lui-même
Intégrer ceci dans votre script, vous pouvez le faire comme ceci:
Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append
, ce Qui devrait faire l'affaire.