当命令包含空格时,cmd /C 在 Rust 中不起作用

blz*_*blz 2 windows command-prompt rust

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

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://stackoverflow.com/"
Run Code Online (Sandbox Code Playgroud)

在cmd中,这是有效的。

cmd /C ""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://stackoverflow.com/""
Run Code Online (Sandbox Code Playgroud)

在 C# 中,这是可行的。

var comm = @"""""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" ""https://stackoverflow.com/""""";
System.Diagnostics.Process.Start("cmd", "/C " + comm);
Run Code Online (Sandbox Code Playgroud)

在 Rust 中,这是行不通的。

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");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。

var comm = @"""""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" ""https://stackoverflow.com/""""";
System.Diagnostics.Process.Start("cmd", "/C " + comm);
Run Code Online (Sandbox Code Playgroud)

但是,它comm在时有效echo hello

我尝试了另外两种方法:

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

    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");
    
    Run Code Online (Sandbox Code Playgroud)
  2. let comm = r#""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://stackoverflow.com/""#;
    
    Run Code Online (Sandbox Code Playgroud)

    '\"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe\"' is not recognized as an internal or external command,
    operable program or batch file.
    
    Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

这是一个已知的问题。不幸的是,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);
Run Code Online (Sandbox Code Playgroud)

执行这个:

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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,内部引号已被转义,尽管在本例中它们不应该被转义。


作为一种解决方法,在许多情况下,您实际上并不需要使用cmd. 在这些情况下,直接执行该过程更为明智:

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