为什么 ANSI 转义码有时在 CMD 中有效
Why do ANSI escape codes sometimes work in CMD
默认情况下,ANSI 转义码在 cmd 中不起作用。
但是某些应用程序进行了某种初始化,之后它们似乎在该会话期间工作。
他们是如何进行初始化的?
这是一个例子-
我构建了一个简单的 Rust 应用程序,它使用 ANSI 代码进行彩色输出。
但是,如果我首先构建项目,然后关闭该会话,然后再次启动 cmd 进入我编译的项目所在的目录,然后 运行 可执行文件(这次完全不使用 cargo本期)-
似乎 cargo 等应用程序(以及其他应用程序)在 cmd 中执行某种初始化步骤,之后终端似乎可以识别 ANSI 代码。
还有 Python
在使用 ANSIescape 代码之前调用 os.system('')
完成工作 -
似乎 os.system('')
是一个错误,您不应该依赖错误来使您的代码正常工作。有没有更好的方法在cmd中初始化ANSI转义码?
您要搜索的是ENABLE_VIRTUAL_TERMINAL_PROCESSING
。它有时“停止工作”的原因是因为某些应用程序在退出前禁用了它。如果它已经启用,那么这就是问题所在。
但是,您可以通过调用 SetConsoleMode()
using the winapi
crate. You can also use the 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();
默认情况下,ANSI 转义码在 cmd 中不起作用。
但是某些应用程序进行了某种初始化,之后它们似乎在该会话期间工作。
他们是如何进行初始化的? 这是一个例子-
我构建了一个简单的 Rust 应用程序,它使用 ANSI 代码进行彩色输出。
但是,如果我首先构建项目,然后关闭该会话,然后再次启动 cmd 进入我编译的项目所在的目录,然后 运行 可执行文件(这次完全不使用 cargo本期)-
似乎 cargo 等应用程序(以及其他应用程序)在 cmd 中执行某种初始化步骤,之后终端似乎可以识别 ANSI 代码。
还有 Python
在使用 ANSIescape 代码之前调用 os.system('')
完成工作 -
似乎 os.system('')
是一个错误,您不应该依赖错误来使您的代码正常工作。有没有更好的方法在cmd中初始化ANSI转义码?
您要搜索的是ENABLE_VIRTUAL_TERMINAL_PROCESSING
。它有时“停止工作”的原因是因为某些应用程序在退出前禁用了它。如果它已经启用,那么这就是问题所在。
但是,您可以通过调用 SetConsoleMode()
using the winapi
crate. You can also use the 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();