当前位置:   article > 正文

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令,就需要知道对应的平台是windows还是linux,如果是windows就需要调用cmd命令,如果是linux平台,就需要调用sh命令,所以可以通过cfg!实现不同平台的判断,然后调用不同的脚本。

  1. use std::process::Command;
  2. pub fn run_cmd() {
  3. // choice a platform use cfg command
  4. let flutter_doctor = "pwd";
  5. let out_put = if cfg!(target_os = "windows") {
  6. Command::new("cmd").arg("/c").arg(flutter_doctor).output().expect("cmd run error")
  7. } else {
  8. Command::new("sh").arg("-c").arg(flutter_doctor).output().expect("shell exec error!")
  9. };
  10. let output_str = String::from_utf8_lossy(&out_put.stdout);
  11. println!("{}", output_str);
  12. }

此时运行上述代码,会打印出当前运行命令所在的文件夹:

可以看到运行的文件夹跑到src-build里面了,这个时候运行flutter doctor肯定是不生效的,当然运行在这个文件夹也是合情合理的,但是我们需要让他跳到外面一层,然后再运行flutter doctor才有效果,所以需要在运行flutter doctor之前,切换文件夹:

  1. use std::process::Command;
  2. use std::io::{self, Write};
  3. fn main() {
  4. // 指定要运行命令的目录
  5. let flutter_project_dir = "path/to/flutter/project";
  6. let output = if cfg!(target_os = "windows") {
  7. // Windows 平台
  8. Command::new("cmd")
  9. .args(&["/C", "cd", &flutter_project_dir, "&&", "flutter", "doctor"])
  10. .output()
  11. .expect("Failed to execute command")
  12. } else {
  13. // macOS 平台
  14. Command::new("sh")
  15. .args(&["-c", &format!("cd {} && flutter doctor", &flutter_project_dir)])
  16. .output()
  17. .expect("Failed to execute command")
  18. };
  19. // 打印命令输出
  20. io::stdout().write_all(&output.stdout).unwrap();
  21. io::stderr().write_all(&output.stderr).unwrap();
  22. }

在这个示例中,我们首先指定了要运行命令的目录 flutter_project_dir。然后,我们使用 Command::new("cmd") 来启动 Windows 的命令行解释器,并通过参数 /c 来告诉它执行完后退出。接着,我们使用 cd 命令切换到指定目录,然后执行 flutter doctor 命令。

最后,我们通过 output() 方法获取命令的输出,并将其打印出来。请确保将 path/to/flutter/project 替换为实际的 Flutter 项目目录路径。

代码优化

如果命令行都单独分开写太麻烦了,可以使用字符串切割将命令行切割为向量,然后引入到命令行里面使用:

  1. use std::process::Command;
  2. use std::io::{self, Write};
  3. fn main() {
  4. // 指定要运行命令的目录
  5. let flutter_project_dir = "path/to/flutter/project";
  6. let output = if cfg!(target_os = "windows") {
  7. // Windows 平台
  8. let build_cmd = format!("/C cd {} && flutter_distributor package --platform windows --targets exe", flutter_project_dir);
  9. let vec_list: Vec<&str> = build_cmd.split_whitespace().collect();
  10. Command::new("cmd")
  11. .args(&vec_list)
  12. .output().expect("cmd run error")
  13. } else {
  14. // macOS 平台
  15. Command::new("sh")
  16. .args(&["-c", &format!("cd {} && flutter doctor", &flutter_project_dir)])
  17. .output()
  18. .expect("Failed to execute command")
  19. };
  20. // 打印命令输出
  21. io::stdout().write_all(&output.stdout).unwrap();
  22. io::stderr().write_all(&output.stderr).unwrap();
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/343772
推荐阅读
相关标签
  

闽ICP备14008679号