在cmd中,ANSI转义代码默认不工作。
但是,一些应用程序进行某种初始化,在初始化之后,它们似乎在该会话中工作。
他们是如何进行初始化的?以下是一个例子-
我构建了一个简单的生锈应用程序,它使用ANSI代码实现彩色输出。

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

看起来像cargo这样的应用程序(以及其他应用程序)在cmd中执行某种初始化步骤,之后终端似乎会识别ANSI代码。
而且在Python中,在使用os.system('')代码之前调用ANSIescape可以完成以下工作-

os.system('')似乎是一个bug,您不应该依赖bug来使您的代码工作。是否有更好的方法来初始化cmd中的ANSI转义码?
发布于 2021-01-08 21:02:31
你要找的是ENABLE_VIRTUAL_TERMINAL_PROCESSING。它有时“停止工作”的原因,是因为一些应用程序在退出之前禁用它。如果它已经启用了,那么这就是东西中断的时候。
但是,通过使用SetConsoleMode()调用winapi crate,您可以轻松地(再次)启用它。您也可以使用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"为了安全起见,您可以首先在enable_virtual_terminal_processing()中调用main()。但是,我绝对建议在执行std::process::Command之后调用它,例如:
let output = Command::new("...")
.args(&["..."])
.output()
.expect("failed to execute process");
#[cfg(windows)]
enable_virtual_terminal_processing();https://stackoverflow.com/questions/63526130
复制相似问题