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

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

2 ответа2

2

Как говорит 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 еще не использовалось, поэтому я могу не получить правильный результат. Лучше всего явно сохранить в неиспользованный дескриптор, который вы укажете.

2

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

:: 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .