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

1 ответ1

6
  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, которые предназначены для немедленной пересылки контента.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .