Вывод командной строки по конвейеру в Windows

я запускаю сервер из пакетного файла, и я хочу, чтобы вывод сервера отображался как на экране, так и в файле журнала. Я нашел способ сделать это с ответ:

powershell "startmyserver | tee server.log"

проблема в том, что канал вызывает выполнение первой команды и ее полное завершение перед выполнением второй команды. Это означает, что я не могу контролировать stdout моего сервера, пока он фактически работает, что я и пытаюсь сделать (я не хочу закрываться вниз по серверу, чтобы проверить последние сообщения журнала).

для более простого примера я попробовал pause. Ну,pause Не существует в Powershell, поэтому мне пришлось запускать его внутри вложенного cmd shell:

powershell "cmd /c pause | tee test.txt"

неудивительно, что после выполнения этой команды я просто получаю мигающий курсор. Через некоторое время я нажимаю клавишу, а затем появляется "нажмите любую клавишу для продолжения" и почти одновременно записывается в файл.

что я хочу случается труба для того чтобы течь линия stdout линией к следующей команде. Другими словами, всякий раз, когда он встречает символ EOL, он должен отправить некоторый вывод, и это должно (в моем случае tee) вызывает появление текста на экране и одновременную запись в файл. (На самом деле, я даже не беспокоюсь о том, написан ли текст в файл построчно, он может быть написан в конце, хотя это не было бы идеально. Я просто хочу, чтобы иметь возможность видеть линии на экране, как они пишутся.)

это возможно в командной строке и / или Powershell?

25
задан Kidburla
28.02.2023 4:23 Количество просмотров материала 2642
Распечатать страницу

1 ответ

эта проблема объясняется на Переполнение Стека как и то, что PowerShell Tee-Object не сбрасывает поток вывода, но только ждет источник, чтобы сделать это, таким образом, вы получаете выходные данные в конце операция. Это сделано специально.

обходной путь, предложенный в ответе, должен был использовать этот код:

./program | ForEach-Object {
    Write-Host $_
    $_
} | Set-Content program.log

альтернативная формулировка попробовать, если выше один не работает:

./program | ForEach-Object {
    [Console]::WriteLine($_)
    [Console]::Out.Flush()
    $_
} | Set-Content program.log

команда будет выглядеть так :

PowerShell -ExecutionPolicy Unrestricted "startmyserver | ForEach-Object { Write-Host $_; $_} | Set-Content server.log"

в моем скромном тестировании выход был сгенерирован слишком быстро для меня, чтобы увидеть, если это сработало, как вы указали.

1
отвечен harrymc 2023-03-01 12:11

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх