2013-11-17 2 views
1

Я не помню, откуда у меня этот фрагмент кода, но он появился в ручке, но с одним падением - он не перенаправляет stderr вовремя!Пакетный журнал с использованием интерполяции

@echo off 
set logit=^> _ 2^>^&1 ^&^& type _^&^&type _^>^>script.log^&^&DEL /q _ 

REM "just stdout output" will be printed to STDOUT and logged properly 
echo just stdout output %logit% 

REM ls with spit out an error message to STDERR and will NOT be logged 
ls %logit% 

Приведенный выше код в основном опирается на тот факт, что логит будет расширен, чтобы сделать следующее:

  1. Отправить STDOUT в файл с именем «_», а перенаправляет STDERR в STDOUT
  2. впечатать файл "_" на экране
  3. Тип файла из "_" в файл "script.log"
  4. Исключить "_" файл

Проблема заключается в перенаправлении STDERR в STDOUT. Я знаю, что 2> & 1 должно произойти последним в командной строке. «& &» объединяет команды, которые ранее должны были быть на отдельных строках. Как таковой, имеет смысл поставить 2> & 1 до первого & & появление. Тем не менее, это не сработает. Ввод 2> & 1 Последнее также ничего не делает:

set lotit==^> _ ^&^& type _^&^&type _^>^>script.log^&^&DEL /q _ 2^>^&1 

Однако, вспыхивают команды следующим образом работает, как ожидалось:

@echo off 

REM "just stdout output" will be printed to STDOUT and logged properly 
echo just stdout output > _ 2>&1 
type _&&type _>>script.log&&DEL /q _ 

REM ls with spit out an error message to STDERR and will NOT be logged 
ls > _ 2>&1 
type _&&type _>>script.log&&DEL /q _ 

Кто-нибудь знает, как я могу сделать STDERR перенаправляется в STDOUT с использованием исходного примера с расширением% logit%?

+1

вы должны удалить 'DEL'. Он может попытаться удалить, прежде чем перенаправление будет выполнено. И он создает другой доступ для записи на диск. Вместо этого просто удалите '_' один раз в самом конце вашего скрипта. – Stephan

ответ

3

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

С перенаправлением сначала перенаправляется STDOUT, а затем STDERR перенаправляется на STDOUT.
Похоже, ваш код это делает.

Вероятно, что уровень ошибок равен 1 или выше, поэтому следующие команды не запускаются.
Решение есть, чтобы изменить все && к & и в коде ^&^& в ^&

Смежные вопросы