2012-03-05 107 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