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