1个不稳定版本
0.1.4 | 2024年4月14日 |
---|---|
0.1.3 |
|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
#113 在 Windows API
每月下载量 266次
28KB
192 行
CreateProcessW
该crate提供了一个类似于std::process
的API,通过windows-rs crate使用Win32 API在Windows上创建和处理进程(参见此示例)。
它与std::process::Command
的主要区别在于它允许运行命令字符串,而不是必须分别传递命令可执行文件和参数。
这相当于运行
std::process::Command::new("cmd.exe")
.arg("/c")
.arg("any_command_string")
.spawn().expect("cannot spawn command");
唯一的区别是,Child
实例将使用命令的PID而不是cmd.exe
的PID。这很重要,因为如上代码中调用.kill()
不会按预期工作,因为它会杀死cmd.exe
的PID而不是实际运行的命令。
用法
将以下内容添加到您的Cargo.toml
[dependencies]
CreateProcessW = "0.1.0"
该crate不遵循Rust的命名建议。如果您想与其他导入的crate保持一致,请使用以下内容
[dependencies]
create_process_w = { version = "0.1.0", package = "CreateProcessW" }
创建命令
Command
结构用于配置和启动进程
use CreateProcessW::Command;
let command = Command::new("cargo.exe clippy -- -D warnings")
.inherit_handles(true)
.current_dir(r"C:\Users\<user>\repos\<repo_name>");
启动进程
spawn
函数启动进程,并返回一个表示已启动子进程的Child
。
use CreateProcessW::Command;
let child = Command::new("notepad.exe")
.spawn()
.expect("notepad failed to start");
std::thread::sleep(std::time::Duration::from_secs(2));
child.kill().expect("cannot kill process");
let status = child.wait().expect("cannot wait process");
if status.success() {
println!("Success!");
} else {
println!("Process exited with status {}", status.code());
}
status
函数启动子进程,等待其完成并返回其ExitStatus
。
use CreateProcessW::Command;
let status = Command::new("notepad.exe")
.status()
.expect("notepad failed to start");
if status.success() {
println!("Success!")
} else {
println!("Process exited with status {}", status.code())
}
依赖项
~128MB
~2M SLoC