Ok, então, como de costume, decidi escrever o programa. Eu tive um pouco de tempo livre hoje à noite e joguei um programa de teste nativo (ou seja, não-Cygwin) que funciona exatamente como eu esperava, embora com duas limitações. (Eu não tenho um anfitrião sempre ligado, mas vou limpar o programa, escrever documentos e liberá-lo.)
-
Não é possível capturar a saída de programas que gravam diretamente no hardware de vídeo (ou hardware virtualizado conforme o caso), portanto o programa Pascal que mencionei não pode ser capturado a menos que eu o recompile sem o direto flag set - que incidentalmente tornou-se desnecessário quando eu o recompilei com o FreePascal.
-
Não pode receber entrada de stderr . Por exemplo, se você executar
cl /? | script.exe c:\test.log
, somente o texto de ajuda do compilador da Microsoft será enviado para o arquivo; o banner só será exibido na tela. (Isso é um pouco desconcertante devido à maneira como o programa funciona, então vou investigar isso.)
Há pouco que pode ser feito sobre o problema (1) (eu não ficaria surpreso se houvesse alguma pessoa inteligente em algum lugar que pudesse descobrir uma maneira de interceptar gravações diretas na tela, mas para todas as intenções e propósitos, provavelmente é improvável.)
O problema (2) pode ser contornado redirecionando stderr para stdout antes de canalizá-lo da seguinte maneira. Não é bonito (ou tão conveniente, mas funciona).
cl /? 2>&1| script.exe c:\test.log
Também pode / deve ser viável do lado do programa, simplificando assim o pipe, mas ainda não encontrei nenhuma informação sobre como (pelo menos de um modo “normal / oficial”, por exemplo, via C ++). Eu tenho uma idéia sobre como instalar um manipulador de interrupção na tabela de vetores de interrupção para interceptar chamadas para as funções de API de saída comuns, que podem / provavelmente funcionarão. De fato, em 1998, eu escrevi um TSR experimental do DOS (que também funciona no Windows NTVDM), que intercepta funções de saída e as colore (isto é, sintaxe genérica) antes de enviá-las para a tela. Seria / deveria ser fácil adaptá-lo para também enviar uma cópia para um arquivo.