PowerShell і Tee


10

Я використовую цю команду, щоб побачити вихід і в консолі, і у файлі:

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

Це працює не так добре, як я очікував, і у мене є кілька питань:

  1. Як перенаправити stderr також у файл?
  2. Вихід працює дуже дивно. Для деяких команд існує велика затримка між друком тексту та консоллю / файл оновлюється. Для деяких інших команд вихід видається оновленим під час друку тексту (я запускаю команди без трійника і знаю, що він повинен друкувати). Ця затримка робить цей трійник майже марним - що робити, якщо буде надрукована якась критична помилка, тому мені потрібно зупинити команду, але я нічого не побачу, поки не пізно?

    Для деяких команд вихід друкується лише після того, як буде виконана повна команда.

  3. Крім того, навіть якщо команда запитує введення користувача, вихід консолі / файлу порожній! Для цієї команди я знаю, чого вона очікує, і сліпо надрукує потрібний текст, і він працював, але для інших - без виводу я чекаю, що щось буде відбуватися нескінченно, поки команда чекатиме мого введення!

Чи є рішення цих питань? Якщо ні, то ця штука в PowerShell абсолютно марна.


Я не вагаюся вважати, що інструмент, який використовується у тисячах скриптів, "абсолютно марний" лише тому, що він може не відповідати вашим конкретним вимогам.
Стівен Дженнінгс

Правильно, я маю на увазі, що в даному випадку це марно :) Я б краще залишити трійку в спокої, ніж матимуть такі погані проблеми.
гонка1

Відповіді:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Див Get-Help about_Redirection.
  2. Ви повинні відловлювати помилки, не покладаючись на Ctrl+ C. Див Get-Help about_Try_Catch_Finally. Це команда, якою ви виконуєте зовнішню програму чи сценарій?
  3. Як я розумію, типово рядкові об'єкти не надсилаються по трубі, поки не буде досягнуто символу кінцевої лінії. Причина досить проста: якби цього не зробити, часткові (прочитані: неповні) рядки пішли б по трубі. Teeможе обробляти часткові рядки відмінно, але інші командлети на кшталт ForEach-Objectабо, Select-Objectзвичайно, не хочуть . Зауважте, у Get-Contentнього є спеціальний перемикач, -ReadCountякий дещо перекреслює цю поведінку, і він серйозно заплутається з Select-Object -Skip/-First/-Last/-Uniqueкомандою далі по трубі.

Дуже добре, що зовнішні програми, які ви запускаєте, не підкорятимуться умовам, яких очікує PowerShell. Teeнаприклад, правильно називається Tee-Object, що повинно розповісти вам про речі, з якими добре працювати. У такому випадку ви можете піти по лінії, щоб дістатись tee.exeвід GNU Win32 Utils або MSYS, які призначені для негайного пересилання вмісту.


1. Дякую; 2. Правильно, я мав на увазі деякі критичні непередбачені ситуації; 3. Я не розумію, що винне в неповних рядках :) Врешті мої команди виконують сценарії Python - це тканинні команди. Я намагався використовувати tee.exe з утиліти Linux, зібрані для Windows - той самий результат, в деяких випадках немає результату. Чи означає це, що моя конкретна конфігурація та конкретні сценарії взагалі не спрацюють з утилітами tee? Дякую.
гонка1

Мені це звучить так, що сценарій python погано поводиться.
Битон Бекон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.