Есть ли способ перенаправить stderror на stdout на время выполнения скрипта в Windows?

Поскольку долгое время я работал сценаристом оболочки UNIX и инженером по выпуску, работающим в среде Windows на полную ставку в связи с моей последней работой, я неизбежно пропускаю некоторые вещи.

Одним из них является мой верный старый exec 2>&1, который в оболочке Bourne постоянно связывает вместе stderr и stdout на время выполнения скрипта, так что журналирование фиксирует все хорошее и плохое.

Я понимаю, что вы можете добавить 2>foo.log в конец каждого вызова командной строки, но мне интересно, есть ли лучший способ.

Есть ли аналог в среде Windows? Здесь мы используем как сценарии файлов .BAT, так и сценарии Perl (в основном для автоматизации сборки, но также и для некоторых других целей), и мне очень хотелось бы узнать, возможно ли это вообще.


person feoh    schedule 01.05.2009    source источник
comment
Вероятно, вы имели в виду 2››foo.log. Эта маленькая оплошность вызвала значительное выпадение волос однажды ночью, несколько лет назад...   -  person RBerteig    schedule 01.05.2009


Ответы (6)


Вы можете вложить .BAT, который выполняет реальную работу, в .BAT, который перенаправляет потоки для ведения журнала.

Что-то вроде

rem log.bat
cmd /c work.bat 1>>logfile.log 2>&1
rem work.bat
make all
perl cleanups.pl

может сделать трюк. Возможно, вы сможете использовать CALL вместо прямого вызова второго CMD.EXE, я не проверял. Если это сработает, то решение может быть автономным: просто вызовите себя с дополнительным аргументом, чтобы указать, что ведение журнала действует и потоки перенаправлены.

person RBerteig    schedule 01.05.2009

В Perl вы можете сделать

open STDERR, '>&STDOUT' or die "Can't dup STDOUT";

для перенаправления вывода STDERR сценария в STDOUT. Дополнительные сведения см. в документации open. Я бы не ожидал, что это повлияет на вывод системных вызовов, то есть system или обратных кавычек.

person Michael Carman    schedule 01.05.2009
comment
Это влияет на вывод системных вызовов и обратных кавычек. Эти подпроцессы получают все дескрипторы STDIN, STDOUT и STDERR, открытые в Perl в момент их вызова. - person xdg; 01.05.2009

Вы можете применять перенаправление к командным блокам, а также к отдельным командам.

(
echo 1
dir
echo 2
) >somefile.txt

Обратите внимание, что невозможно использовать метки и перейти внутри командных блоков.

person mihi    schedule 02.05.2009

Прочтите эту статью базы знаний от MS. Образец взят из указанной статьи:

Вы можете распечатать ошибки и стандартный вывод в один файл, используя команду «&1», чтобы перенаправить вывод для STDERR в STDOUT, а затем отправить вывод из STDOUT в файл:

 dir file.xxx 1> output.msg 2>&1
person dirkgently    schedule 01.05.2009
comment
Спасибо, но я не думаю, что вы читали вопрос. Я знаю, что могу перенаправить stdout и stderr для каждого вызова команды, я хочу сделать указанное перенаправление на время выполнения скрипта. - person feoh; 01.05.2009
comment
Моя точка зрения была такова: я не вижу никаких проблем с использованием вышеизложенного со сценарием. Однако, насколько мне известно, для пакетных файлов нет специального STDERR. - person dirkgently; 01.05.2009

Кажется, что 2>&1 работает для меня для скриптов:

testcmd.cmd > stdboth.txt 2>&1

Что именно вы делаете и чего вы ожидаете, когда делаете это?

person Michael Burr    schedule 01.05.2009
comment
Спасибо, но, как я сказал в вопросе, я ищу что-то, что перенаправляет stderr на stdout для всего скрипта, а не только для вызова одной команды. - person feoh; 01.05.2009
comment
Я не уверен, что вы подразумеваете под «всем сценарием» - в приведенном выше примере stdout и stderr, похоже, перенаправляются для всех команд в сценарии testcmd.cmd (и любых сценариях, которые он вызывает). Команды внутри скрипта изменять не нужно. - person Michael Burr; 02.05.2009

:log_me
@if "%~1" NEQ "*" ("%~nx0" * >> "%~n0.log" 2>&1)

:script
echo this is success
echo this is error>&2

И, если ваш пакетный скрипт имеет параметры командной строки:

:log_me
@call :script %* >> "%~n0.log" 2>&1
exit /b

:script
echo this is success
echo this is error>&2
person Amr Ali    schedule 02.11.2014