这是一个非常简单的JScript脚本:
test.js
WScript.Echo('\x1B[7mReverse\x1B[0m Normal'); WScript.stdout.WriteLine('\x1B[7mReverse\x1B[0m Normal');
我已经完成了许多测试,CSCRIPT输出的转义序列直接写入屏幕时无效,只有先写入文件然后再打字才能工作,或者由FOR / F和ECHOed捕获.
我有两个问题:
1)为什么直接写入控制台不能从CSCRIPT工作?
2)如何直接写作?
我想将文本突出显示添加到我的JREPL.BAT regular expression find/replace utility(因此是batch-file标签),但如果它需要临时文件和/或FOR / F,我将不会实现该功能.
The following terminal sequences are intercepted by the console host
when written into the output stream if the
ENABLE_VIRTUAL_TERMINAL_PROCESSING flag is set on the screen buffer handle using the SetConsoleMode flag. You can use
GetConsoleMode and SetConsoleMode flags to configure this behavior.
所以,只是为了测试,我写了一个简单的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,TRUE,&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; };
使用mingw / gcc编译为run.exe.结果是
现在,处理cscript和findstr的输出并解释转义序列.
此外,如果不是运行单独的程序,我运行cmd.exe本身
由于我没有更改findstr.exe,cscript.exe或cmd.exe中的代码,只有它们工作的环境似乎是
>既没有cscript也没有findstr配置/更改控制台缓冲区配置
>一些内部cmd命令更改缓冲区配置(我忘记将其包含在捕获中,但复制test.txt con和提示也可以工作)或者,正如您所指出的,它们使用不同的输出方法
>写入标准输出流的应用程序的唯一要求是正确配置控制台输出缓冲区模式.
不,我不知道如何从纯批次启用它.