PowerShell et Tee

9

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:

  1. Comment rediriger stderr également vers un fichier?
  2. 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.

  3. 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.

race1
la source
J'hésite à croire qu'un outil utilisé dans des milliers de scripts est "complètement inutile" simplement parce qu'il peut ne pas répondre à vos besoins spécifiques.
Stephen Jennings
Bon, je veux dire que c'est inutile dans ce cas particulier :) Je ferais mieux de laisser le tee seul, car il y aura de si mauvais problèmes.
race1

Réponses:

7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Tu vois Get-Help about_Redirection.
  2. Vous devez intercepter les erreurs et ne pas compter sur Ctrl+ C. Tu vois Get-Help about_Try_Catch_Finally. La commande que vous exécutez est-elle un programme externe ou un script?
  3. Si je comprends bien, les objets chaîne ne sont généralement pas envoyés dans le tuyau tant qu'un caractère de fin de ligne n'est pas atteint. La raison est assez simple: si ce n'était pas le cas, des chaînes partielles (lire: incomplètes) descendraient dans le tuyau. Teepeut gérer correctement les chaînes partielles, mais d'autres applets de commande comme ForEach-Objectou Select-Objectcertainement pas. Notez que Get-Contentpossède un commutateur spécial -ReadCountqui remplace quelque peu ce comportement, et il gâchera sérieusement avec une Select-Object -Skip/-First/-Last/-Uniquecommande 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 obtenir tee.exede GNU Win32 Utils ou MSYS qui sont conçus pour transférer immédiatement du contenu.

Lardons
la source
1. Merci; 2. Exact, je voulais parler de certaines situations imprévues critiques; 3. Je ne comprends pas ce qui est coupable pour les chaînes incomplètes :) Finalement, mes commandes exécutent des scripts Python - ce sont des commandes de structure. J'ai essayé d'utiliser tee.exe à partir des utilitaires Linux compilés pour Windows - le même résultat, aucune sortie dans certains cas. Est-ce à dire que ma configuration concrète et mes scripts concrets ne fonctionneront pas du tout avec les utilitaires tee? Je vous remercie.
race1
Cela me semble que le script python se comporte mal.
Bacon Bits