繁体   English   中英

为什么 ANSI 转义码有时在 CMD 中起作用

[英]Why do ANSI escape codes sometimes work in CMD

ANSI 转义码在 cmd 中默认不起作用。

但是,一些应用程序进行了某种初始化,之后它们似乎在 session 期间工作。

他们如何进行初始化? 这是一个例子 -

我构建了一个简单的 rust 应用程序,它使用彩色 output 的 ANSI 代码。

显示使用 ANSI 转义码的货物的图像。

但是,如果我首先构建项目,然后关闭 session,然后再次启动 cmd,转到我编译的项目所在的目录,然后运行可执行文件(这次在此会话中根本不使用货物)-

ANSI 无货转义码

似乎像 cargo(以及其他应用程序)这样的应用程序在 cmd 中执行了某种初始化步骤,之后终端似乎可以识别 ANSI 代码。

并且还在 Python 中调用os.system('')在使用 ANSIescape 代码之前调用 -

ANSI 转义码在 os.system('') 之后起作用

似乎os.system('')是一个错误,您不应该依赖错误来使您的代码正常工作。 有没有更好的方法来初始化 cmd 中的 ANSI 转义码?

您要搜索的是ENABLE_VIRTUAL_TERMINAL_PROCESSING 它有时“停止工作”的原因是因为某些应用程序在退出之前将其禁用。 如果它已经启用,那么这就是东西中断的时候。

但是,您可以通过使用winapi crate调用SetConsoleMode()轻松启用它(再次)。 你也可以使用winapi-util crate ,这让它更容易一些。

#[cfg(windows)]
pub fn enable_virtual_terminal_processing() {
    use winapi_util::console::Console;

    if let Ok(mut term) = Console::stdout() {
        let _ = term.set_virtual_terminal_processing(true);
    }
    if let Ok(mut term) = Console::stderr() {
        let _ = term.set_virtual_terminal_processing(true);
    }
}
[target.'cfg(windows)'.dependencies]
winapi-util = "0.1"

为了安全起见,您最初可以在main()中调用enable_virtual_terminal_processing() ) 。 但是,我绝对建议在执行std::process::Command后调用它,例如:

let output = Command::new("...")
    .args(&["..."])
    .output()
    .expect("failed to execute process");

#[cfg(windows)]
enable_virtual_terminal_processing();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM