Я не помню, откуда у меня этот фрагмент кода, но он появился в ручке, но с одним падением - он не перенаправляет 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%
Приведенный выше код в основном опирается на тот факт, что логит будет расширен, чтобы сделать следующее:
- Отправить STDOUT в файл с именем «_», а перенаправляет STDERR в STDOUT
- впечатать файл "_" на экране
- Тип файла из "_" в файл "script.log"
- Исключить "_" файл
Проблема заключается в перенаправлении 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%?
вы должны удалить 'DEL'. Он может попытаться удалить, прежде чем перенаправление будет выполнено. И он создает другой доступ для записи на диск. Вместо этого просто удалите '_' один раз в самом конце вашего скрипта. – Stephan