Как прочитать поток вывода ошибок в командном файле? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть пакетный скрипт, который запускает сервер. Этот сервер затем распечатывает свои журналы в STDOUT и STDERR в случае ошибок.

Я хочу перенаправить STDOUT и STDERR в команду tee, чтобы разделить вывод. С помощью команды tee из UnxUtils это работало просто отлично.

Однако, чтобы сделать мое приложение переносимым, я не могу зависеть от UnxUtils, поэтому мне нужно написать собственную команду tee.

Я написал пакетный скрипт, который считывает STDOUT, как предложено в этом ответе (2. кодовый блок).

Это работает, но только для перенаправленного STDOUT, а не для STDERR.

Примечание. Вывод из STDERR отсутствует как в файле, так и в командной строке.

Как я могу заставить его читать оба потока?

Как перенаправить вывод (% 1 - сервер,% 2 - файл, на который я хочу перейти в журналы)?

%1 2>&1 | %~dp0tee.bat -a %2

Это прекрасно работает (так как вызывает UnxUtils, а не мой пакетный скрипт):

%1 2>&1 | tee -a %2

Как я читаю ввод в tee.bat:

for /F "tokens=*" %%a in ('findstr /n $') do (
    set "line=%%a"
    setlocal EnableDelayedExpansion
    set "line=!line:*:=!"

    echo(!line!

    if %append%==true (
        echo(!line! >> %output%
    ) else (
        echo(!line! > %output%
    )
    endlocal
)

1 Ответ

1 голос
/ 03 мая 2019

PowerShell имеет командлет Tee-Object. Переменная $Input получает стандартный ввод.

echo asf 2>&1 | powershell -NoLogo -NoProfile -Command "$Input | Tee-Object -FilePath './tee.txt'"

Смотри также: https://stackoverflow.com/a/38668360/447901

...