Windows перенаправление вывода


Ошибка перенаправления из командной строки - Visual C++

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

В этой статье описывается перенаправление сообщений об ошибках из командной строки.

Исходная версия продукта:   Visual C++
Исходный номер базы знаний:   110930

Заключение

При перенаправлении выходных данных из приложения с помощью символа > сообщения об ошибках по-прежнему выводится на экран. Это связано с тем, что сообщения об ошибках часто отправляются в стандартный поток ошибок, а не в стандартный исходящий поток.

Выходные данные из консольного приложения (командной строки) или команды часто отправляются в два отдельных потока. Обычные выходные данные отправляются в стандартную версию (STDOUT), а сообщения об ошибках отправляются в стандартную ошибку (STDERR). При перенаправлении выходных данных консоли > с помощью символа вы перенаправляете только STDOUT. Чтобы перенаправить STDERR, необходимо указать 2> символ перенаправления. При этом выбирается второй поток вывода, который является STDERR.

Пример

dir file.xxx Команда (где file.xxx не существует) отобразит следующие выходные данные:

Том на диске F имеет серийный номер тома 34EC-0876
Файл не найден

При перенаправлении выходных данных на устройство NUL dir file. xxx > nulс помощью вы по-прежнему увидите сообщение об ошибке:

Файл не найден

Чтобы перенаправить сообщение об ошибке в NUL, используйте следующую команду:

dir file.xxx 2> nul 

Вы также можете перенаправить выходные данные в одно место, а ошибки — в другое.

dir file.xxx > output.msg 2> output.err 

Вы можете &1 распечатать ошибки и стандартные выходные данные в один файл с помощью команды перенаправить выходные данные stDERR в STDOUT, а затем отправить выходные данные из STDOUT в файл:

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

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

Когда вы вводите команду в командной строке Windows, вывод команды отображается в окне командной строки. Для некоторых команд выходные данные могут быть длиной в несколько строк, а иногда и длиннее, чем высота командного окна, что приводит к прокрутке для просмотра всех выходных данных.

Если вы хотите этого избежать или хотите сохранить копию вывода, сгенерированного командой, вы можете скопировать текст из командного окна и вставить его в текстовый файл. Однако есть более простой способ «копирования» вывода в текстовый файл. Вы используете команду перенаправления .

духовное значение ...

Please enable JavaScript

духовное значение птиц

Чтобы использовать команду перенаправления, используйте символ « > » и имя файла в конце команды, которую вы хотите выполнить.

Например, если вы хотите сохранить вывод команды ipconfig (отображает сетевые настройки), откройте командное окно и введите следующую команду.

 ipconfig / all> network_info.txt 

ПРИМЕЧАНИЕ. При этом создается файл network_info.txt в текущем каталоге. В этом примере, показанном на следующем рисунке, файл будет сохранен в каталоге C: \ network_info . Если вы хотите сохранить файл в другом каталоге, вы можете указать полный путь к каталогу в командной строке следующим образом:

 ipconfig / all> c: \ my_directory \ network_info.txt 

Как только вы введете команду и нажмете Enter, вы вернетесь в командную строку. Вывод отправляется в текстовый файл, но не на экран, поэтому вы не видите вывод.

Файл network_info.txt создается в текущем каталоге. Чтобы просмотреть вывод, введите следующую команду, чтобы открыть текстовый файл в Блокноте :

 notepad.exe network_info.txt 

ПРИМЕЧАНИЕ. Если вы сохранили файл в другом каталоге, обязательно укажите полный путь к файлу после « notepad.exe » в командной строке следующим образом:

 notepad.exe C: \ my_directory \ network_info.txt 

Обратите внимание, что вы также можете просто перейти к этому каталогу в Проводнике и открыть файл оттуда. Вот пример вывода команды ipconfig в текстовом файле.

Чтобы закрыть Блокнот, выберите « Выход» в меню « Файл» .

Чтобы закрыть окно командной строки, введите команду exit в командной строке и нажмите Enter .

ПРИМЕЧАНИЕ. Если вы используете одно и то же имя файла во второй раз, этот файл будет перезаписан, а все ранее выведенные данные будут потеряны. Чтобы сохранить ваш предыдущий вывод, используйте другое имя файла или вы можете добавить вывод в конец существующего файла. Чтобы добавить данные в существующий файл, используйте два символа перенаправления, как показано ниже:

 dir c: \ my_music >> network_info.txt 

ПРИМЕЧАНИЕ. Перенаправление также полезно для сохранения списков каталогов. Предыдущая команда сохраняет список каталога c: \ my_music в конце файла network_info. txt . Наслаждайтесь!

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

Один из наиболее полезных способов регистрации и устранения неполадок в поведении команд или пакетных заданий, выполняемых в Windows, — перенаправление вывода в файл.

Однако есть несколько способов перенаправить запись из командной строки в файл. Выбранный вами вариант зависит от того, как вы хотите просмотреть вывод своей команды.

Содержание

    Как работает вывод командной строки Windows

    Когда вы вводите команду в консоли Windows (командная строка), вывод этой команды направляется в два отдельных потока.

    • STDOUT : Стандартный выход — это место, куда поступают любые стандартные ответы от команд. Например, стандартным ответом на команду DIR является список файлов внутри каталога.
    • STDERR : Стандартная ошибка — это место, куда отправляются любые сообщения об ошибках, если есть проблема с командой. Например, если в каталоге нет файлов, команда DIR выведет «Файл не найден» в поток стандартных ошибок.

    Вы можете перенаправить вывод в файл в Windows для обоих этих потоков вывода.

    Перенаправление стандартного вывода на запись в новый файл

    Существует два способа перенаправления стандартного вывода команды в файл. Первый заключается в отправке вывода команды для записи в новый файл каждый раз, когда вы запускаете команду.

    Для этого откройте командную строку и введите:

      dir test.exe > myoutput.txt  

    Символ > указывает консоли вывести STDOUT в файл с указанным вами именем.

    Когда вы запустите эту команду, вы заметите, что в командном окне нет никакого ответа, кроме ошибки, что файл не существует.

    Это связано с тем, что стандартный вывод команды был перенаправлен в файл с именем myoutput.txt. Теперь файл существует в том же каталоге, где вы выполнили команду. Стандартный вывод ошибок по-прежнему отображается, как обычно.

    Примечание : Будьте осторожны, чтобы изменить активный каталог для командной строки перед запуском команды. Таким образом, вы будете знать, где хранятся выходные файлы.

    Вы можете просмотреть стандартный вывод файла, введя «myoutput.txt» в командном окне. Это откроет текстовый файл в программе просмотра текстовых файлов по умолчанию. Для большинства людей это обычно Notepad.exe.

    При следующем запуске той же команды предыдущий выходной файл будет удален. Новый выходной файл будет воссоздан с выводом последней команды.

    Перенаправить запись стандартного вывода в тот же файл

    Что делать, если вы не хотите перезаписывать тот же файл? Другой вариант — использовать >> вместо > для перенаправления в выходной файл. В этом примере вы должны ввести:

      dir test.exe >> myoutput.txt  

    Вы увидите тот же результат (только ошибку).

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

    Каждый раз, когда вы запускаете команду и добавляете выходные данные в файл, она записывает новый стандартный вывод в конец существующего файла.

    Перенаправить стандартную ошибку в файл

    Точно так же, как вы можете перенаправить запись стандартного вывода в файл, вы также можете вывести стандартный поток ошибок в файл.

    Для этого вам нужно добавить 2> в конец команды, а затем выходной файл ошибки, который вы хотите создать.

    В этом примере введите команду: 

      dir test.exe > myoutput.txt 2> output.err  

    Это отправляет стандартный поток вывода в myoutput.txt, а стандартный поток ошибок — на вывод .ошибка В результате в окне консоли вообще не отображается поток вывода.

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

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

    Перенаправить все выходные записи в один и тот же файл

    Все описанные выше подходы приводят к созданию нескольких файлов. Один файл предназначен для стандартного потока вывода, а другой — для стандартного потока ошибок.

    Если вы хотите включить оба этих вывода в один и тот же файл, вы также можете это сделать. Для этого вам просто нужно перенаправить весь вывод в один и тот же файл с помощью следующей команды.

      dir test.exe 1> myoutput.txt 2>&1  

    Вот как работает эта команда:

    • Стандартный вывод направляется в выходной файл с номером 1. номер 2 перенаправляется на выходной файл с номером 1.

    Это добавит вывод ошибки в конец стандартного вывода.

    Это полезный способ увидеть все выходные данные любой команды в одном файле.

    Заглушение стандартных выходных потоков или потоков ошибок

    Вы также можете отключить либо стандартный вывод, либо стандартный поток ошибок, перенаправив вывод в NUL вместо файла.

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

      dir test.exe 1> myoutput.txt 2>nul  

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

    Это полезно, если вы не заботитесь об ошибках и не хотите, чтобы они стали помехой.

    Вы можете выполнить любую из указанных выше команд вывода из BAT-файла, и вывод этой строки будет отправлен в указанный вами выходной файл. Это полезный способ узнать, были ли какие-либо команды в BAT-файле с ошибками при попытке запуска.

    Райан с 2007 года пишет в Интернете статьи с практическими рекомендациями и другие статьи о технологиях. Он имеет степень бакалавра наук в области электротехники, 13 лет проработал в области автоматизации, 5 лет в ИТ, а сейчас работает инженером по приложениям. Прочтите полную биографию Райана

    Подпишитесь на YouTube!

    Вам понравился этот совет? Если это так, загляните на наш канал YouTube на нашем родственном сайте Online Tech Tips. Мы охватываем Windows, Mac, программное обеспечение и приложения, а также предлагаем множество советов по устранению неполадок и обучающих видеороликов. Нажмите на кнопку ниже, чтобы подписаться!

    Подписаться

    Командная строка

    - Как перенаправить Windows cmd stdout и stderr в один файл?

    спросил

    Изменено 6 месяцев назад

    Просмотрено 602 тыс. раз

    Я пытаюсь перенаправить весь вывод (stdout + stderr) команды Windows в один файл:

     C:\>каталог 1> a.txt 2> a.txt Процесс не может получить доступ к файлу, так как он используется другим процессом. 

    Возможно ли это, или я должен просто перенаправить на два отдельных файла?

    • windows
    • командная строка
    • cmd
    • канал

    2

    Вам нужно:

     каталог > a.txt 2>&1 

    Синтаксис 2>&1 будет перенаправлять 2 (stderr) до 1 (stdout). Вы также можете скрыть сообщения, перенаправив их на NUL . Дополнительные пояснения и примеры приведены на странице документации Microsoft Перенаправление сообщений об ошибках из командной строки: STDERR/STDOUT.

    10

    Ответ Андерса Линдала правильный, но следует отметить, что если вы перенаправляете стандартный вывод в файл и хотите также перенаправить стандартный вывод, вы ДОЛЖНЫ убедиться, что 2>&1 указывается ПОСЛЕ редирект 1> , иначе работать не будет.

     REM *** ПРЕДУПРЕЖДЕНИЕ: ЭТО НЕ БУДЕТ ПЕРЕНАПРАВЛЯТЬ STDERR НА STDOUT **** директория 2>&1 > a.txt 

    14

    Справочная информация из документации Microsoft

    Хотя принятый ответ на этот вопрос верен, на самом деле не так много, чтобы объяснить , почему это работает, и, поскольку синтаксис не сразу ясен, я сделал быстрый поиск в Интернете, чтобы найти из того, что на самом деле происходит. В надежде, что эта информация будет полезна другим, я размещаю ее здесь.

    Взято со страницы документации Microsoft:
    Перенаправление сообщений об ошибках из командной строки: STDERR/STDOUT

    Резюме

    При перенаправлении вывода приложения с помощью символа > сообщения об ошибках по-прежнему выводятся на экран. Это связано с тем, что сообщения об ошибках часто отправляются в стандартный поток ошибок, а не в стандартный исходящий поток.

    Вывод консольного (командная строка) приложения или команды часто отправляется в два отдельных потока. Обычный вывод отправляется на стандартный вывод (STDOUT), а сообщения об ошибках отправляются на стандартный вывод об ошибках (STDERR). Когда вы перенаправляете вывод консоли с помощью > символ, вы только перенаправляете STDOUT. Чтобы перенаправить STDERR, вы должны указать 2> для символа перенаправления. Это выбирает второй поток вывода, который является STDERR.

    Пример

    Команда dir file.xxx (где file.xxx не существует) отобразит следующий вывод:

    Том на диске F — том Candy Cane. Серийный номер тома — 34EC-0876
    Файл не найден

    Если вы перенаправляете вывод на устройство NUL с помощью dir file.xxx > nul , вы все равно увидите сообщение об ошибке:

    Файл не найден

    Чтобы перенаправить сообщение об ошибке на NUL, используйте следующую команду:

     каталог file.xxx 2> ноль 

    Или можно перенаправить вывод в одно место, а ошибки в другое.

     каталог file.xxx 1> output.msg 2>&1 

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

     каталог file.xxx 1> output.msg 2>&1 

    Чтобы добавить stdout и stderr в общий файл журнала скрипта:

     dir >> a.txt 2>&1 

    1

    Правильно, дескриптор файла 1 для процесса - STDOUT, перенаправленный 1> или > (1 может быть опущен, по соглашению интерпретатор команд [cmd.exe] знает, как это обработать). Дескриптор файла 2 — STDERR, перенаправленный 2> .

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

    >> (для STDOUT или STDERR) ДОПОЛНЯЕТ, а не ЗАМЕНЯЕТ файл. Таким образом, вы получаете кумулятивный файл журнала, показывающий результаты всех запусков процесса, что обычно более полезно.

    Счастливого пути...

    Однако нет гарантии, что выходные данные SDTOUT и STDERR переплетаются построчно в своевременном порядке с использованием синтаксиса перенаправления слияния POSIX .

    Если приложение использует буферизованный вывод, может случиться так, что текст одного потока будет вставлен в другой на границе буфера, которая может появиться в середине текстовой строки.

    Специализированный консольный регистратор выходных данных (например, «StdOut/StdErr Logger» by 'LoRd MuldeR' ) может быть более надежным для такой задачи.

    См.: Проекты MuldeR с открытым исходным кодом

    В пакетном файле (Windows 7 и выше) я нашел этот метод наиболее надежным :протоколирование TITLE "Команды регистрации" ECHO «Прочитайте этот вывод в файле журнала» ЭХО.


    Learn more

Только новые статьи

Введите свой e-mail

Видео-курс

Blender для новичков

Ваше имя:Ваш E-Mail: