Принудительный вывод на консоль в пакетном скрипте с перенаправлением вывода в файл

370
Firstrock

У меня есть командный файл, который среди прочего устанавливает среду и выполняет сборку. И stdout (вывод скрипта), и stderr (ошибки компилятора) перенаправляются в отдельные файлы. Возможно ли для командного файла принудительно отправить вывод данной команды на консоль, независимо от перенаправления на командный файл?

Это может быть для важного сообщения, которое не должно быть перенаправлено. Или, более конкретно, поместить colorкоманду в скрипт для установки цветов переднего плана и фона консоли, чтобы предупредить меня о том, чтобы не использовать консоль для других целей (поскольку среда изменилась). Когда стандартный вывод перенаправлен, colorне изменит цвета консоли.

0
Используйте PowerShell для таких задач https://superuser.com/a/74128/164837 Alex 6 лет назад 0
Перенаправить на устройство `> CON:` LotPings 6 лет назад 0

2 ответа на вопрос

2
LotPings

Чтобы продемонстрировать мой комментарий:

:: Q:\Test\2018\08\10\SU_1347898.cmd @Echo off cls ( Echo normal output 1 redirected with the code block net file returns an error Echo *** this line should go directly to Console *** >CON: Echo normal output 2 redirected with the code block ) 1>SU_1347898_.txt 2>SU_1347898_Error.log echo( findstr "^" %~n0_* 

Образец вывода:

*** this line should go directly to Console ***  SU_1347898_Error.log:Die Syntax dieses Befehls lautet: SU_1347898_Error.log: SU_1347898_Error.log:NET FILE SU_1347898_Error.log:[id [/CLOSE]] SU_1347898_Error.log: SU_1347898_.txt:normal output 1 redirected with the code block SU_1347898_.txt:normal output 2 redirected with the code block 
2
dbenham

Как говорит LotPings в своем комментарии и ответе, вы всегда можете направить вывод на консоль через >con(заметьте, трейлинг :не нужен).

Но не все функциональные возможности работают должным образом при обращении к con. Например, clsне правильно очищает экран.

Другой вариант - сохранить копию исходного stdout перед перенаправлением в файл, а затем направить специальные команды на сохраненный дескриптор.

@echo off 9>&1 1>stdout.txt 2>stderr.txt ( echo Most output goes to a file echo Hello world >&9 echo But this goes to the original definition of stdout - the console ) 

Обратите внимание, что каждый раз, когда вы перенаправляете существующий дескриптор, исходное определение сохраняется в первом доступном неопределенном дескрипторе перед выполнением перенаправления. Таким образом, предполагая, что не было никакого предварительного перенаправления, тогда & 3 ниже будет указывать на исходный стандартный вывод (консоль), поэтому нет необходимости явного сохранения в 9.

@echo off 1>stdout.txt 2>stderr.txt ( echo Most output goes to a file echo Hello world >&3 echo But this normally goes to the original definition of stdout - the console ) 

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