Windows cmd/C不';如果命令包含空格,则不能在锈迹中工作
我想从Rust程序运行此命令: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
“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/""#;
是
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)