MS documentation 状态
以下终端序列被控制台主机截获
当写入输出流时,如果
ENABLE_VIRTUAL_TERMINAL_PROCESSING 标志是使用 SetConsoleMode 标志在屏幕缓冲区句柄上设置的。您可以使用
GetConsoleMode 和 SetConsoleMode 标志来配置此行为。
所以,为了测试,我编写了一个简单的 C 程序来更改控制台模式,然后充当管道或启动另一个进程并等待(抱歉,只是测试代码)。
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
int _tmain(int argc, TCHAR *argv[]){
// Console handlers
DWORD dwOldMode, dwMode ;
HANDLE hStdout;
// Pipe read buffer
int c;
// Spawn process variables
STARTUPINFO si;
PROCESS_INFORMATION pi;
// Retrieve standard output handle
hStdout = GetStdHandle( STD_OUTPUT_HANDLE );
if (! GetConsoleMode( hStdout, &dwOldMode ) ) {
return 1;
}
// Change standard output handle
dwMode = dwOldMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (! SetConsoleMode( hStdout, dwMode ) ){
CloseHandle( hStdout );
return 2;
}
if( argc < 2 ) {
// If there is not an argument, read stdin / write stdout
while ( EOF != (c = getchar()) ) putchar( c );
} else {
// Argument is present, create a process and wait for it to end
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( !CreateProcess(NULL, argv[1], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi )){
printf( "CreateProcess failed (%d).\n", GetLastError() );
return 3;
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
// Restore old console mode
SetConsoleMode( hStdout, dwOldMode );
CloseHandle( hStdout );
return 0;
};
编译为run.exe 和mingw/gcc。结果是
现在,处理来自cscript 和findstr 的输出并解释转义序列。
另外,如果我不运行单独的程序,而是运行cmd.exe 本身
由于我没有从findstr.exe、cscript.exe 或cmd.exe 更改代码,因此只有他们工作的环境似乎
cscript 和 findstr 都不配置/更改控制台缓冲区配置
一些内部cmd 命令会更改缓冲区配置(我忘记将其包含在捕获中,但copy test.txt con 和prompt 也可以)或者,正如您所指出的,它们使用不同的输出方法
写入标准输出流的应用程序的唯一要求是正确配置控制台输出缓冲区模式。
不,我不知道如何从纯批处理中启用它。