ANSI 颜色集图形渲染在批次中中断并在继续后工作

2023-12-08

我有一个批处理,其中有一个子部分,该子部分迭代 EXE 文件的行以尝试运行,然后该批处理根据 EXE 的退出代码对 EXE 进行排序。

由于某种原因,ANSI SGR 在设置前一个图形渲染而不是重新渲染后似乎会破坏或回显文字文本。

我回去重新参考这个question和原始文档,但我不确定为什么我的批次的这个特定区域在第一行回显后会破坏控制台内的 ANSI 颜色。

我只用记事本替换了我的工具,您可以手动关闭它以获得零退出,或者使用控制面板结束进程以获得非零退出。

的内容test_map.log应该不会太重要,因为您实际上只使用记事本并向其发送一些参数。这就是我的设置:

C:\temp\qt_selftest.exe
C:\temp\sub_test.exe
C:\temp\cmd_module_test.exe
C:\temp\failing_qt_test.exe
C:\temp\passing_qt_test.exe
C:\temp\random_qt_test.exe
C:\temp\fail_module.exe
C:\temp\pass_module.exe

正如您从屏幕截图中看到的,这些线条是按字面意思处理的。在我从中提取的实际批次中,它确实再次恢复工作......但在该块内并且only在那个街区,它坏了。

enter image description here

知道我可能在哪里搞砸了吗?

由于 ESC 序列被转换,我无法直接共享代码,因此要点如下:https://gist.github.com/the-nose-knows/1bebce2719e020188c6307cff736f951

If you need to re-add them before the [, use the alt-code of 027, as alt 0 2 7


正如 erykson 所说,这可以通过确保启用虚拟终端模式来解决。如果你only关心PowerShell的颜色,可以添加/A切换到对 CMD.exe 的调用,否则您将需要一个像填充程序一样处理此类问题的小进程,但同时也确保 VTM 已启用。这不是wholly这是一件坏事,因为这个抽象层可能会在未来的用例和错误中派上用场。

该片段唯一“奇怪”的部分是我的相对路径用法。此代码片段是一个来自子目录的进程 shim,用于从一个目录运行批处理 shim。

代码的重要部分是要包含的标头以及在获取控制台句柄后为 StdOut 启用 VTM。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <Windows.h>

#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif

bool uses_whitespace(std::string test_string)
{
    size_t path_white_space_query = test_string.find(' ', 0);

    if (path_white_space_query != std::string::npos)
    {
        return true;
    }

    return false;
}

int main(int argc, char* argv[])
{
    std::string this_app_path = std::string(argv[0]);

    auto it = this_app_path.find_last_of("\\", std::string::npos);

    std::string path(this_app_path, 0, it);

    // Just forwarding the args that were sent to this shim to a batch in a known location,
    // making sure whitespace arguments keep their quotes when forwarded.

    // CMD.exe will need proper quote-handling, or the call will get mangled.
    std::string str = "C:\\Windows\\System32\\cmd.exe /C \"\"" + path + "\\..\\app_shim.bat\"";
    std::vector<std::string> args;
    std::copy(argv + 1, argv + argc, std::back_inserter(args));

    for (auto const& arg : args)
    {
        if (uses_whitespace(arg))
        {
            str += (" \"" + arg + "\"");
        }
        else
        {
            str += (" " + arg);
        }
    }

    // end-of-CMD-call final wrapping quote
    str += "\"";

    HANDLE stdOutHandle = GetStdHandle(STD_OUTPUT_HANDLE);

    DWORD mode = 0;
    GetConsoleMode(stdOutHandle, &mode);
    SetConsoleMode(stdOutHandle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);

    int exit_code = system(str.c_str());

    CloseHandle(stdOutHandle);

    return exit_code;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANSI 颜色集图形渲染在批次中中断并在继续后工作 的相关文章

随机推荐

  • 将 selenium 响应 url 传递给 scrapy

    我正在学习 Python 并且正在尝试抓取这个page对于下拉菜单上的特定值 之后 我需要单击结果表上的每个项目来检索特定信息 我能够选择该项目并检索网络驱动程序上的信息 但我不知道如何将响应网址传递给crawlspider driver
  • 无法从我的 Android 应用程序向给定的 postId 发布 facebook 之类的内容

    我正在尝试将我的 Android 应用程序中的 facebook 发布到给定的postId 10154194181895153 我读过很多方法来做到这一点 但他们每个人都返回了一个FB响应错误 你能解释一下A和B之间的区别吗 我尝试将 A
  • 从 R 中的 JSON 文件获取数据

    假设我有以下 json 文件 id 000018ac 04ef 4270 81e6 9e3cb8274d31 currentCompany currentTitle currentPosition 我使用以下代码 Usersfile lt
  • AndroidJAVAClass 无法执行我的非静态函数

    我从我的统一代码中调用了java函数 我的 java 类中有静态和非静态类型的函数访问第一个静态函数 我用了 AndroidJavaClass plugin new AndroidJavaClass com android test Tes
  • matplotlib widgets Slider demo源码讲解

    我试图理解源代码能够使用 matplotlib 的滑块小部件 定义函数的代码段update 真的很困扰我 我不明白争论有什么意义val in def update val 以及值val没有在任何地方提到 这是同样的问题def reset e
  • 如何增加netbeans中的java堆大小?

    我正在尝试在 netbeans 中用 java 构建一个近 110000 个单词的词典 trie 我的代码运行良好 但出现异常 如下所示 Exception in thread main java lang OutOfMemoryError
  • 等待子窗口加载完成

    是否有一个简单的挂钩来检测脚本打开的窗口是否已完成加载 基本上 我想要相当于onLoad 钩子 但我无法直接设置它 假设子文档是给定的 并且我实际上无法在其中放入我自己的任何代码 例如 假设我有以下两个文件 parent html
  • 无法在不扰乱重力的情况下翻转球的方向

    我正在制作一款类似乒乓球的游戏 只不过只有一个球拍并且球以抛射运动移动 目标是让球尽可能长时间地在球拍上弹跳 当球被球拍击中时 y其速度分量的符号翻转 问题是重力也作用在球上 因此当球向上击打时 由于重力的反向作用 球会加速 这是球类的代码
  • 将 SORM 与 Play Framework 结合使用会导致引发反射异常

    我一直在尝试让 SORM 与 Play Framework 2 2 SNAPSHOT 以及 2 1 1 一起使用 目前 我正在尝试运行我创建的简约示例应用程序 以便更轻松地追踪问题 不幸的是 我收到的错误消息对我没有任何帮助 val app
  • Google Cloud Function - 错误:ENOENT:没有这样的文件或目录

    我正在尝试执行一个简单的功能来调整存储中新上传的图像的大小 我使用以下方法来帮助我做到这一点 import tmpdir from os import join dirname from path import as sharp from
  • OpenGL 着色器的显式与自动属性位置绑定

    当为 OpenGL 着色器程序设置属性位置时 您面临两个选项 glBindAttribLocation 在链接之前显式定义属性位置 or glGetAttribLocation 链接后获得自动分配的属性位置 使用其中一种比另一种有什么用处
  • 模拟过程中会话丢失

    我使用 SonataAdminBundle 并配置了sonata user in config yml sonata user impersonating route profile logged more config 我的管理面板位于
  • UITableview:如何禁用某些行而不是其他行的选择

    我正在组中显示tableview从 XML 解析的内容 我想禁用它的点击事件 我根本不应该点击它 该表包含两组 我只想禁用第一组的选择 而不禁用第二组的选择 单击第二组的第一行navigates到我的管子player view 如何才能只选
  • Android:ScrollView 内的 Listview

    我想要一个可以滚动的布局和其中的列表视图 列表视图将根据其中的项目数量扩展其高度 只有外面的ScrollView是可滚动的 这是我的代码
  • req.user 在 Google Passport 策略中不可用

    我有一个快速应用程序 它通过 Passport 管理身份验证 最初使用本地策略 为此 我刚刚添加了 Google 登录 帐户创建 几乎一切都按照文档进行 我遇到的问题是 用户可以使用 Google 策略创建帐户 但我无法完全理解它 以便经过
  • 如何路由 /About 到 /Home/About

    我刚刚开始使用 ASP NET MVC 这太棒了 但是 我不太明白设置路线 如何将 About 路由到 Home About 视图 主页 About aspx 我希望能够通过以下方式访问它 首页 关于要不就 About 如果你想明确地为其设
  • 预填充 Django 表单

    我试图从查询中获取 Django 表单 但我一直以错误的方式进行操作 检查了几个例子 但我做的有点不同 这是我的代码 Le Form class ItemForm ModelForm class Meta model Item exclud
  • 我可以通过多边形绑定 st_distance 调用吗?

    我看过关于这个主题的类似帖子 例如 here and here 但不是 sf tidyverse 生态系统特有的 I have a series of lakes a series of sample points within each
  • 在 Firebug 中查看 CSS 伪元素

    是否有任何解决方法可以查看 CSS 伪元素 例如 after before等 称为CSS3 生成和替换的内容模块 在萤火虫中 现在 当我选择一个元素时 我只能看到应用于它的静态 CSS 我没有看到使用样式应用于它 after and bef
  • ANSI 颜色集图形渲染在批次中中断并在继续后工作

    我有一个批处理 其中有一个子部分 该子部分迭代 EXE 文件的行以尝试运行 然后该批处理根据 EXE 的退出代码对 EXE 进行排序 由于某种原因 ANSI SGR 在设置前一个图形渲染而不是重新渲染后似乎会破坏或回显文字文本 我回去重新参