PowerShell и мишень

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

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 абсолютно бесполезна.

9
задан 15.02.2019, 16:23

1 ответ

  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Посмотрите Get-Help about_Redirection.
  2. Необходимо захватывать ошибки, не полагаясь на Ctrl+C. Посмотрите Get-Help about_Try_Catch_Finally. Команда, Вы запускаете внешнюю программу или сценарий?
  3. Насколько я понимаю обычно строковые объекты не отправляются вниз канал, пока символ конца строки не достигнут. Причина довольно проста: если это не сделало этого, неравнодушного (читайте: неполный), строки спустились бы по каналу. 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, которые разработаны для того, чтобы сразу передать содержание.

6
ответ дан 07.12.2019, 13:33

Теги

Похожие вопросы