Перенаправить stdout и stderr изнутри пакетного файла - программирование
Подтвердить что ты не робот

Перенаправить stdout и stderr изнутри пакетного файла

Есть ли способ перенаправить stdout и stderr для пакетного файла изнутри.

Я представляю что-то вроде

set STDOUT=stdout.log
echo Some text
a.exe
b.exe
c.exe

Если оба Some text, а вывод a.exe, b.exe и c.exe будет идти до stdout.log

Возможно ли это?

4b9b3361

Ответ 1

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

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

>stdout.log 2>&1 (
  echo Some text
  a.exe
  b.exe
  c.exe
)

Другой вариант - поместить ваши команды в подпрограмму и перенаправить CALL

call :redirect >stdout.log 2>&1
exit /b

:redirect
echo Some text
a.exe
b.exe
c.exe
exit /b

Ответ 2

Да, вам нужно перенаправить и добавить файл stdout к вашему файлу (1>> %STDOUT%) и подключить stderr к stdout (2>&1):

set STDOUT=stdout.log
echo Some text 1>> %STDOUT% 2>&1
a.exe 1>> %STDOUT% 2>&1
b.exe 1>> %STDOUT% 2>&1
c.exe 1>> %STDOUT% 2>&1

@EitanT правильно отметил, что ваш вопрос не обязательно подразумевает запись как stderr, так и stdout в один и тот же файл. Итак, для полноты, здесь версия, записывающая в разделенные файлы:

set STDOUT=stdout.log
set STDERR=stderr.log
echo Some text 1>> %STDOUT% 2>> %STDERR%
a.exe 1>> %STDOUT% 2>> %STDERR%
b.exe 1>> %STDOUT% 2>> %STDERR%
c.exe 1>> %STDOUT% 2>> %STDERR%