Есть ли способ перенаправить stderror в stdout на время действия скрипта в Windows? - PullRequest
1 голос
/ 01 мая 2009

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 01 мая 2009

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

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

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

2 голосов
/ 01 мая 2009

Вы можете вкладывать .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, я не проверял. Если это сработает, то решение может быть автономным: просто позвоните себе с дополнительным аргументом, чтобы указать, что ведение журнала включено и потоки перенаправлены.

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

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

(
echo 1
dir
echo 2
) >somefile.txt

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

0 голосов
/ 03 ноября 2014
: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
0 голосов
/ 01 мая 2009

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

testcmd.cmd > stdboth.txt 2>&1

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

0 голосов
/ 01 мая 2009

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

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

 dir file.xxx 1> output.msg 2>&1
...