繁体   English   中英

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

[英]cmd /C doesn't work in Rust when command includes spaces

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

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://stackoverflow.com/"

在cmd中,这是有效的。

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);

在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");

我收到以下错误。

The network path was not found.

但是,当commecho hello时它可以工作。

我尝试了另外两种方法:

  1. 这个

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

     'C:\\Program' is not recognized as an internal or external command, operable program or batch file. 
  2. 这个

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

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

这是一个已知问题 不幸的是,用于转义参数的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM