我正在尝试使用 std::process::Command 从 rust 可执行文件内部调用 bcdedit。
在 Windows 10 上的管理员命令提示符下执行生成的程序时,我得到:
'bcdedit' is not recognized as an internal or external command, operable program or batch file.
。
- 在同一个 shell 中直接调用 bcdedit 就可以了。
- 使用其绝对路径调用它没有任何区别。
- 调用其他可执行文件正常。
- 不使用 cmd.exe 而直接调用 bcdedit 将返回
error: Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }
。
这发生在 Windows 10 Pro,版本 1903,内部版本 18362.657 上。我安装了另一个 Windows 10(Windows 10 Pro,版本 1809,内部版本 17763.1039),它运行正常。
我有一个暴露了该问题的 Rust 代码片段:
use std::process::{Command, Stdio};
use std::env::args;
fn main() {
let mut cmd_args = args();
let cmd = if let Some(arg1) = cmd_args.nth(1) {
arg1
} else {
String::from("dir")
};
println!("command is '{}'", cmd);
match Command::new("cmd.exe")
.arg("/c")
.arg(&cmd)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output() {
Ok(output) => {
println!("Executed '{}', success: {}", cmd, output.status.success());
println!("stdout: '{}'", String::from_utf8_lossy(&output.stdout));
println!("stderr: '{}'", String::from_utf8_lossy(&output.stderr));
}
Err(why) => {
eprintln!("Failed to execute '{}', error: {:?}", &cmd, why);
}
}
}
答案1
@HelpingHand 的评论指出了正确的方向。问题是我意外地创建了一个 32 位可执行文件,而我以为我正在创建 64 位可执行文件。显然,64 位 Windows 上的 bcdedit 仅在 64 位下可用,因此无法在正常位置 ( C:\Windows\system32\bcdedit.exe
) 中访问 32 位可执行文件。但可以在 处访问它C:\Windows\sysnative\bcdedit.exe
。