J'utilise cette commande pour voir la sortie à la fois dans la console et dans un fichier:
powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc
Cela ne fonctionne pas aussi bien que prévu et j'ai quelques questions:
- Comment rediriger stderr également vers un fichier?
La sortie fonctionne très étrange. Pour certaines commandes, il y a un énorme délai entre l'impression du texte et la mise à jour de la console / du fichier. Pour certaines autres commandes, la sortie semble mise à jour lorsque le texte est imprimé (j'exécute des commandes sans tee et je sais ce qu'il doit imprimer). Ce délai rend ce tee-shirt presque inutile - que se passe-t-il si une erreur critique est imprimée, je dois donc arrêter la commande, mais je ne verrai rien avant qu'il ne soit trop tard?
Pour certaines commandes, la sortie n'est imprimée qu'après l'exécution de la commande complète.
- De plus, même si la commande demande une entrée utilisateur, la sortie console / fichier est vide! Pour cette commande, je sais ce qu'elle attend et j'imprime aveuglément le texte nécessaire et cela a fonctionné, mais pour d'autres - sans sortie, j'attendrai quelque chose à l'infini tandis que la commande attendra mon entrée!
Existe-t-il des solutions à ces problèmes? Sinon, ce truc dans PowerShell est complètement inutile.
la source
Réponses:
My-Command 2>&1 | Tee-Object 'myfile.log'
. Tu voisGet-Help about_Redirection
.Get-Help about_Try_Catch_Finally
. La commande que vous exécutez est-elle un programme externe ou un script?Tee
peut gérer correctement les chaînes partielles, mais d'autres applets de commande commeForEach-Object
ouSelect-Object
certainement pas. Notez queGet-Content
possède un commutateur spécial-ReadCount
qui remplace quelque peu ce comportement, et il gâchera sérieusement avec uneSelect-Object -Skip/-First/-Last/-Unique
commande plus bas dans le tuyau.Il se peut très bien que les programmes externes que vous exécutez n'obéissent pas aux conventions attendues par PowerShell.
Tee
, par exemple, est correctement appeléTee-Object
, ce qui devrait vous indiquer le genre de choses avec lesquelles il est bon de travailler. Dans ce cas, vous pouvez être plus loin sur la route pour obtenirtee.exe
de GNU Win32 Utils ou MSYS qui sont conçus pour transférer immédiatement du contenu.la source