我正在尝试将Windows10控制台中提供的新的CSCRIPT转义序列功能与VT100 (JScript)结合使用。但是我不能让它工作。
下面是一个非常简单的JScript脚本:
test.js
WScript.Echo('\x1B[7mReverse\x1B[0m Normal');
WScript.stdout.WriteLine('\x1B[7mReverse\x1B[0m Normal');
我做了许多测试,当直接写入屏幕时,CSCRIPT输出的转义序列是无能为力的,并且只有在先写入文件然后写入TYPEed时才起作用,或者在/F和ECHOed中由捕获。
我有两个问题:
1)为什么CSCRIPT无法直接写入控制台?
2)如何实现直写?
我想在我的JREPL.BAT regular expression find/replace utility中添加文本突出显示(因此使用batch-file标记),但如果它需要临时文件和/或/F,我将不会实现该功能。
发布于 2016-09-09 18:57:45
如果使用SetConsoleMode标志在屏幕缓冲区句柄上设置了ENABLE_VIRTUAL_TERMINAL_PROCESSING标志,则在写入输出流时,控制台主机会截获以下终端序列。您可以使用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;
};
使用mingw/gcc
编译为run.exe
。结果是
现在,处理来自cscript
和findstr
的输出,并解释转义序列。
此外,如果我不运行单独的程序,而是运行cmd.exe
本身
由于我没有更改findstr.exe
、cscript.exe
或cmd.exe
的代码,只有它们工作的环境看起来
cscript
和findstr
都不会配置/更改控制台缓冲区configurationcmd
命令会更改缓冲区配置(我忘记将其包括在捕获中,但copy test.txt con
和prompt
也可以工作),或者,正如您所说,它们使用不同的输出方法不,我不知道如何从纯批处理中启用它。
https://stackoverflow.com/questions/38779381
复制相似问题