dev_tool/
cmd_util.rs

1use std::process::Command;
2
3// Command::new(program):创建一个新的命令对象,program 是要执行的命令名称或路径
4// .arg(arg):添加命令参数
5// .args(args):添加多个命令参数(接收迭代器)
6// .output():执行命令并捕获输出(stdout/stderr)和退出状态
7// .status():执行命令并仅获取退出状态(输出直接传递给父进程)
8// .spawn():启动命令但不等待其完成(返回 Child 结构体,可手动控制)
9// .env(key, value):设置环境变量
10// .current_dir(path):设置命令执行的工作目录
11pub struct CmdUtil;
12
13impl CmdUtil {
14
15    /// TODO 未测试过
16    /// 
17    /// 运行命令
18    /// cmd: 数组方式的命令,第一个元素是命名执行程序
19    pub fn run_cmd(cmd: Vec<&str>) -> Result<(), String> {
20        if cmd.len() > 0 {
21            let mut c = Command::new(cmd[0]);
22            if cmd.len() > 1 {
23                c.args(&cmd[1..]);
24            }
25            // 执行命令并捕获输出
26            let output = c.output().expect("请检查命令是否正确,或是否具备执行权限或环境变量等!");
27            // 处理命令执行结果
28            if output.status.success() {
29                println!("命令执行成功!");
30                // 可选:打印ffmpeg输出信息
31                let stdout = String::from_utf8_lossy(&output.stdout);
32                println!("命令输出:\n{}", stdout);
33            } else {
34                println!("命令执行失败!");
35                // 打印错误信息
36                let stderr = String::from_utf8_lossy(&output.stderr);
37                println!("错误信息:\n{}", stderr);
38            }
39        }
40        Ok(())
41    }
42
43    /// TODO 未测试过
44    pub fn run_script(script_path: &str) -> std::io::Result<()> {
45        #[cfg(windows)]
46        let status = Command::new("cmd.exe")
47            .arg("/c")
48            .arg(script_path)  // Windows 批处理脚本路径
49            .status()?;
50    
51        #[cfg(not(windows))]
52        let status = Command::new("/bin/sh")
53            .arg(script_path)  // Unix Shell 脚本路径
54            .status()?;
55    
56        println!("脚本执行状态: {}", status);
57        Ok(())
58    }
59
60    /// TODO 未测试过
61    pub fn run_script_with_params(script_path: &str, params: Vec<&str>) -> std::io::Result<()> {
62        #[cfg(windows)]
63        let status = Command::new("cmd.exe")
64            .arg("/c")
65            .arg(script_path)  // Windows 批处理脚本路径
66            .args(&params)
67            .status()?;
68    
69        #[cfg(not(windows))]
70        let status = Command::new("/bin/sh")
71            .arg(script_path)  // Unix Shell 脚本路径
72            .args(&params)
73            .status()?;
74    
75        println!("脚本执行状态: {}", status);
76        Ok(())
77    }
78}
79
80#[cfg(test)]
81mod tests {
82    use super::*;
83
84    #[test]
85    fn test_run_cmd() {
86        // 在 Windows 上使用 cmd.exe 执行 cd 命令
87        // let result = Command::new("cmd.exe")
88        //     .arg("/c")
89        //     .arg("cd /d D:/Environment && dir")  // 可以追加其他命令查看效果
90        //     .status()
91        //     .expect("执行命令失败");
92
93        let cmd = vec!["cmd.exe", "/c", "cd", "/d", "d:/Environment/"];
94        let res = CmdUtil::run_cmd(cmd);
95        println!("{:?}", res);
96
97        let cmd = vec!["ffmpeg"];
98        let res = CmdUtil::run_cmd(cmd);
99        println!("{:?}", res);
100    }
101}