PowerShell и тройник

9

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

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 совершенно бесполезна.

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

Ответы:

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