PowerShell Tee вопросы

4497
race1

Я использую эту команду, чтобы увидеть вывод как на консоли, так и в файле:

powershell -command "my_command_1 | tee ('logs\.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  powershell -command "my_command_2 | tee ('logs\.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))" # etc 

Это работает не так хорошо, как я ожидал, и у меня есть несколько вопросов:

  1. Как перенаправить stderr также в файл?
  2. Вывод работает очень странно. Для некоторых команд существует огромная задержка между печатным текстом и обновлением консоли / файла. Для некоторых других команд вывод выводится обновленным при печати текста (я запускаю команды без тройника и знаю, что он должен печатать). Эта задержка делает этот тройник почти бесполезным - что, если будет напечатана какая-то критическая ошибка, поэтому мне нужно остановить команду, но я ничего не увижу, пока не станет слишком поздно. Для некоторых команд вывод выводится только после выполнения полной команды.
  3. Кроме того, даже если команда запрашивает пользовательский ввод, консоль / выходной файл пуст! Для этой команды я знаю, чего она ожидает, и слепо печатать необходимый текст, и это сработало, но для других - без вывода данных я буду ждать, что что-то произойдет бесконечно, пока команда будет ожидать мой ввод!

Есть ли решения для этих проблем? Если нет, то эта вещь в Powershell совершенно бесполезна.

8
Я сомневаюсь, что инструмент, используемый в тысячах скриптов, «абсолютно бесполезен» только потому, что он может не соответствовать вашим конкретным требованиям. Stephen Jennings 13 лет назад 0
Правильно, я имею в виду, что это бесполезно в данном конкретном случае :) Я бы лучше оставил тройку в покое, чем будет иметь такие плохие проблемы race1 13 лет назад 0

1 ответ на вопрос

6
Bacon Bits
  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 - тот же результат, в некоторых случаях ничего не выводилось. Означает ли это, что моя конкретная конфигурация и конкретные сценарии вообще не будут работать с утилитами? Спасибо. race1 13 лет назад 0
Это звучит для меня, как будто сценарий python ведет себя неправильно. Bacon Bits 13 лет назад 0
Грустные новости. Спасибо за подробный ответ. race1 13 лет назад 0