Я использую эту команду, чтобы увидеть вывод как в консоли, так и в файле:
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
Это работает не так хорошо, как я ожидал, и у меня есть несколько вопросов:
- Как перенаправить stderr также в файл?
Вывод работает очень странно. Для некоторых команд существует огромная задержка между печатным текстом и обновлением консоли / файла. Для некоторых других команд вывод выводится обновленным при печати текста (я запускаю команды без тройника и знаю, что он должен печатать). Эта задержка делает этот тройник почти бесполезным - что, если будет напечатана какая-то критическая ошибка, поэтому мне нужно остановить команду, но я ничего не увижу, пока не станет слишком поздно?
Для некоторых команд вывод выводится только после полной команды.
- Более того, даже если команда запрашивает ввод пользователя, вывод консоли / файла будет пустым! Для этой команды я знаю, чего она ожидает, и слепо печатать необходимый текст, и это сработало, но для других - без вывода я буду ждать, пока что-то произойдет бесконечно, пока команда будет ждать моего ввода!
Есть ли решения для этих проблем? Если нет, то эта штука в PowerShell совершенно бесполезна.
источник
Ответы:
My-Command 2>&1 | Tee-Object 'myfile.log'
, СмGet-Help about_Redirection
.Get-Help about_Try_Catch_Finally
. Эта команда запускает внешнюю программу или скрипт?Tee
может нормально обрабатывать частичные строки, но другие командлеты вроде быForEach-Object
илиSelect-Object
нет. Обратите внимание, что уGet-Content
него есть специальный переключатель,-ReadCount
который несколько отменяет это поведение, и он будет серьезно портитьSelect-Object -Skip/-First/-Last/-Unique
команду дальше по трубе.Вполне возможно, что внешние программы, которые вы запускаете, не будут подчиняться соглашениям, которые ожидает PowerShell.
Tee
например, правильно называетсяTee-Object
, что должно рассказать вам о тех вещах, с которыми хорошо работать. В этом случае вы можете продолжить работуtee.exe
с GNU Win32 Utils или MSYS, которые предназначены для немедленной пересылки контента.источник