首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Windows 10上将ANSI转义序列与CSCRIPT一起使用?

如何在Windows 10上将ANSI转义序列与CSCRIPT一起使用?
EN

Stack Overflow用户
提问于 2016-08-05 08:29:09
回答 1查看 1.4K关注 0票数 6

我正在尝试将Windows10控制台中提供的新的CSCRIPT转义序列功能与VT100 (JScript)结合使用。但是我不能让它工作。

下面是一个非常简单的JScript脚本:

test.js

代码语言:javascript
复制
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,我将不会实现该功能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-09 18:57:45

MS documentation状态

如果使用SetConsoleMode标志在屏幕缓冲区句柄上设置了ENABLE_VIRTUAL_TERMINAL_PROCESSING标志,则在写入输出流时,控制台主机会截获以下终端序列。您可以使用GetConsoleMode和SetConsoleMode标志来配置此行为。

因此,为了测试,我编写了一个简单的C程序来更改控制台模式,然后充当管道,或者启动另一个进程并等待(对不起,只是测试代码)。

代码语言:javascript
复制
#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。结果是

现在,处理来自cscriptfindstr的输出,并解释转义序列。

此外,如果我不运行单独的程序,而是运行cmd.exe本身

由于我没有更改findstr.execscript.execmd.exe的代码,只有它们工作的环境看起来

  • cscriptfindstr都不会配置/更改控制台缓冲区configuration
  • some内部cmd命令会更改缓冲区配置(我忘记将其包括在捕获中,但copy test.txt conprompt也可以工作),或者,正如您所说,它们使用不同的输出方法
  • 写入标准输出流的应用程序的唯一要求是正确配置控制台输出缓冲区模式。

不,我不知道如何从纯批处理中启用它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38779381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档