rust std::process::命令执行时没有错误,但什么也没发生

ntjbwcob  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(120)

我试图将cd导入到一个包含steamcmd.exe的目录中并运行一个命令。当我运行这段代码时,没有发生错误,实际上什么也没有发生。

use std::{process::Command};

let steamcmd_dir = String::from("C:/Users/user/Desktop/steamcmd");
let content = String::from("steamcmd +login anonymous");
let mut command = Command::new("cmd");

command.arg("/C");
command.arg("cd");
command.arg("/C");
command.arg(steamcmd_dir);
command.arg("/C");
command.arg(content);

command.output().unwrap();
oaxa6hgo

oaxa6hgo1#

Command::output()文档说明:
将命令作为子进程执行,等待它完成并收集其所有输出。
SteamCMD的工作原理类似于数据库CLI客户端,您可以使用它的命令行标志交互使用它,也可以使用它的一次性命令。然而,您提供给SteamCMD的标志使它在交互模式下运行,并且根本不退出,所以您需要附加+quit,以便SteamCMD在完成时退出,如下所示:

steamcmd +login anonymous +quit

您也不一定需要通过cmdcd找到SteamCMD所在的位置,如果您愿意,您可以直接引用可执行文件:

let output = Command::new("C:/Users/user/Desktop/steamcmd/steamcmd.exe")
    .args(["+login", "anonymous", "+quit"])
    .output()
    .unwrap();
pkwftd7m

pkwftd7m2#

docs on cmd
要对<string>使用多个命令,请使用命令分隔符&&分隔它们。
因此,您可以使用以下代码:

use std::process::Command;

fn main() {
    let steamcmd_dir = String::from("C:/Users/user/Desktop/steamcmd");
    let content = String::from("steamcmd +login anonymous");
    let mut command = Command::new("cmd")
        .arg("/C")
        .arg([format!("cd {}", steamcmd_dir), content].join("&&"));

    command.output().unwrap();
}

但是,您也可以避免同时使用cmd,方法是使用std::env::set_current_dir更改当前进程的工作目录,然后像在Svenskunganka's answer中那样直接运行steamcwd

fn main() {
    let steamcmd_dir = String::from("C:/Users/user/Desktop/steamcmd");
    std::env::set_current_dir(steamcmd_dir).unwrap();
    let mut command = Command::new("steamcmd")
        .args(["+login", "anonymous", "+quit"]);

    command.output().unwrap();
}

相关问题