在Java中,当我想要启动一个进程时,我可以告诉它要运行的命令:
String[] commands = {"Perl", "-e", "print \"hello world\""}
ProcessBuilder processBuild = new ProcessBuilder();
processBuild.command(commands);
在C#中,我遇到了问题,因为我需要做同样的事情,但我必须将filename
和arguments
分别填写为单独的字符串:
processBuild.FileName = commands[0];
for (int x = 1; x < commands.Length; x++)
{
processBuild.Arguments += " " + commands[x];
}
现在我不知道用户将尝试调用什么,因此我无法根据目标程序进行定制。我上面的解决方案的问题是该进程尝试运行perl -e print "hello world"
。为什么它迫使我像命令行一样对待它?
当然我不能做if !start with [-/] { Surround with quotes }
这样的事情,因为那时像“cmd / c echo hello”这样的东西会变成cmd /c "echo" "hello"
。我的意思是,我想我可以制作一堆if / elses并尝试对它有所了解,但必须有更好的方法吗?
所以我转向你们帮助我。如何在C#中启动一个以非cmd行方式指定其参数的进程?
答案 0 :(得分:1)
Process类使用了引擎盖下的CreateProcess API,它是可用于启动进程的最低级API之一。这个API将可执行文件与参数分开,因为它会像你一样区分它们。
两种解决方案: