gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:09:51 26 4
gpt4 key购买 nike

我正在尝试通过 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 捕获时才有效。

enter image description here

我有两个问题:

1) 为什么直接写入控制台不能从 CSCRIPT 工作?
2)我怎样才能让直接写入工作?

我想为我的 JREPL.BAT regular expression find/replace utility 添加文本突出显示(因此是 标签),但如果它需要临时文件和/或 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, 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.exemingw/gcc .结果是

Output capture of test session

现在,来自 cscript 的输出和 findstr被处理并解释转义序列。

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

Output capture of redirected cmd.exe

由于我没有更改 findstr.exe 的代码, cscript.execmd.exe ,似乎只有他们工作的环境
  • 两者都不是 cscript也不是 findstr配置/更改控制台缓冲区配置
  • 一些内部cmd命令更改缓冲区配置(我忘记将其包含在捕获中,但 copy test.txt conprompt 也有效)或者,正如您所指出的,它们使用不同的输出方法
  • 写入标准输出流的应用程序的唯一要求是正确配置控制台输出缓冲区模式。

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

    关于batch-file - 如何在 Windows 10 上使用带有 CSCRIPT 的 ANSI 转义序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38779381/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com