невозможно перенаправить выходное сообщение в командной строке Windows (cmd.exe) - PullRequest
8 голосов
/ 03 ноября 2011

Я попытался выполнить следующую команду в командной строке Windows.

abc.exe >log.txt 2>&1

Я ожидаю, что весь вывод с abc.exe будет направлен на log.txt, но он не работает, так как log.txt пуст.

Однако, если я просто выполню abc.exe, вывод отобразится в командной строке Windows.

Я не уверен, какой обработчик вывода используется этим приложением (STDOUT или STDERR), но мне интересно, есть ли способ перехватить все сообщения независимо от обработчика.

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Приложение: начиная с Windows 10 v1809, Windows наконец поддерживает псевдоконсоли .Если доступно, это предлагает лучшее решение, чем использование устаревшего консольного API.


Если вам действительно нужно захватить это сообщение, используйте консольный API .

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

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

SetConsoleCursorPosition может установить требуемое положение курсора.

После того, как вы запустите программу, ReadConsoleOutput позволяет вам читать то, что она записала в консоль.

Затем вы можете использовать GetStdHandle(STD_OUTPUT_HANDLE) и SetConsoleActiveScreenBuffer, чтобы вернуть консоль в исходный буфер, и CloseHandle, чтобы закрыть дополнительный буфер.

0 голосов
/ 14 июля 2015

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

...