Windows cmd/C不';如果命令包含空格,则不能在锈迹中工作

Windows cmd/C不';如果命令包含空格,则不能在锈迹中工作,windows,rust,command-prompt,Windows,Rust,Command Prompt,我想从Rust程序运行此命令: “C:\ProgramFiles(x86)\Google\Chrome\Application\Chrome.exe”https://stackoverflow.com/" 在cmd中,这是有效的 var comm = @"""""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" ""https://stackoverflow.com/"""""; System.Diagnostics.P

我想从Rust程序运行此命令:

“C:\ProgramFiles(x86)\Google\Chrome\Application\Chrome.exe”https://stackoverflow.com/"
在cmd中,这是有效的

var comm = @"""""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" ""https://stackoverflow.com/""""";
System.Diagnostics.Process.Start("cmd", "/C " + comm);
cmd/C“C:\Program Files(x86)\Google\Chrome\Application\Chrome.exe”https://stackoverflow.com/""
在C#中,这是有效的

var comm = @"""""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" ""https://stackoverflow.com/""""";
System.Diagnostics.Process.Start("cmd", "/C " + comm);
在生锈的情况下,这不起作用

let comm = r#"""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://stackoverflow.com/"""#;
let output = Command::new("cmd")
    .args(&["/C", comm])
    .output()
    .expect("failed to execute process");
我得到一个如下错误

未找到网络路径。
但是,当
comm
echo hello
时,它会工作

我尝试了另外两种方法:

  • 这个

    let comm = r#"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://stackoverflow.com/"#;
    
    let comm = r#""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://stackoverflow.com/""#;
    

    “C:\Program”未被识别为内部或外部命令,
    可操作的程序或批处理文件。
    
  • 这个

    let comm = r#"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://stackoverflow.com/"#;
    
    let comm = r#""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://stackoverflow.com/""#;
    

  • 这是。不幸的是,用于转义参数的Windows规则非常繁琐,很难正确执行

    此代码:

    let comm = r#""C:\Program Files\Google\Chrome\Application\chrome.exe" https://stackoverflow.com/"#;
    let mut cmd = Command::new("cmd");
    cmd.arg("/c");
    cmd.arg(comm);
    
    执行以下命令:

    “cmd”“/c”“\”c:\\Program Files\\Google\\Chrome\\Application\\Chrome.exe“https://stackoverflow.com/"
    
    不幸的是,内部引号已被转义,尽管在本例中不应转义


    作为一种变通方法,在许多情况下,实际上不需要使用
    cmd
    。在这些情况下,直接执行流程要明智得多:

    let output = Command::new(r#"C:\Program Files\Google\Chrome\Application\chrome.exe"#)
        .args(&["https://stackoverflow.com/"])
        .output()
        .expect("failed to execute process");
    

    我找到了类似情况的解决方案:

    use std::process::Command;
    use std::thread;
    use std::time;
    
    fn main() {
        let child = Command::new("netsh")
            .arg("advfirewall")
            .arg("firewall")
            .arg("add")
            .arg("rule")
            .arg(r#"name="something2""#)
            .arg("dir=in")
            .arg("action=allow")
            .arg("protocol=TCP")
            .arg("localport=12006")
            .spawn()
            .expect("failed");
        thread::sleep(time::Duration::new(10, 0));
        println!("done");
        let output = child.stdout;
        println!("{:?}", output);
    }
    
    这涉及命令行提示符

    netsh advfirewall firewall add rule name=“something2”dir=in action=allow protocol=TCP localport=12006
    
    Chrome可能在路径中,因此您只需使用
    Chrome
    即可运行它。如果用户不喜欢chrome呢?在我的环境中,
    chrome
    不在路径中。实际上,
    comm
    是一个由用户输入的值。Rust不仅仅是将参数串联在一起,它还为您引用它们。你试过了吗,没有在论点周围加上额外的引号?我明白。谢谢。具体来说,您只需
    cmd/C
    即可运行
    cmd
    内置程序,如
    dir
    等,或批处理脚本行。(如果您有批处理文件,可以直接运行,AFAIK)