2012-03-05 61 views
2

在Java中,当我想启动一个进程,我可以告诉它的命令来运行:指定参数

String[] commands = {"Perl", "-e", "print \"hello world\""} 
ProcessBuilder processBuild = new ProcessBuilder(); 
processBuild.command(commands); 

在C#中,我有一个问题,因为我需要做同样的的事情,但我必须分别填写filenamearguments作为单独的字符串:

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回声你好”变成cmd /c "echo" "hello"。我的意思是我想我可以制作一些if/elses,并试着对它做出明智的决定,但是必须有更好的方法?

所以我转向你们帮我一把。我如何在C#中启动一个以非cmd行方式指定其参数的进程?

回答

1

Process类在底层使用了CreateProcess API,它是可用于启动进程的最低级别的API之一。这个API将可执行文件与参数分隔开来,因为它会像你一样告诉它们相同的困难。

两个解决方案:

  • 启动CMD.EXE作为一个过程,你的手“指挥”作为参数来 它。 cmd.exe会为你解析。
  • 解析自己虽然很困难。
+1

这仍然需要知道如何创建一个有效的参数字符串(它可以被解析成参数列表)。没有办法只提供参数列表(Unix的'execv'或'execvp'),因此不需要相关引用的知识? – jamessan 2012-03-07 20:51:31