batch-file – 如何在Windows 10上使用带有CSCRIPT的ANSI转义序列?

前端之家收集整理的这篇文章主要介绍了batch-file – 如何在Windows 10上使用带有CSCRIPT的ANSI转义序列?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用CSCRIPT(JScript)在 Windows 10控制台中提供的新VT100 ANSI转义序列功能.但我无法让它发挥作用.

这是一个非常简单的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,我将不会实现该功能.

MS documentation

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本身

由于我没有更改find​​str.exe,cscript.exe或cmd.exe中的代码,只有它们工作的环境似乎是

>既没有cscript也没有findstr配置/更改控制台缓冲区配置
>一些内部cmd命令更改缓冲区配置(我忘记将其包含在捕获中,但复制test.txt con和提示也可以工作)或者,正如您所指出的,它们使用不同的输出方法
>写入标准输出流的应用程序的唯一要求是正确配置控制台输出缓冲区模式.

不,我不知道如何从纯批次启用它.

猜你在找的Windows相关文章