2017-06-07 45 views
0

所以我花了半個一個一天試圖讓這沒有陽性結果的工作。我正在使用一個Java ProcessBuilder來執行一些帶有幾個參數的.exe文件,但是文件路徑包含空間,並且不知何故我無法使它正常工作。我已經檢查了一些其他SO職位並實現與轉義引號和分裂它在命令和參數等般的環繞代碼解決方案我的代碼如下:的Java的ProcessBuilder錯誤當用空間(S),路徑

try { 
    ProcessBuilder pBuilder = new ProcessBuilder(
     // Main Command. 
     "C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe", 
     // Command Parameters. 
     "start", 
     "-D C:\\namewith space\\database\\database", 
     /*The quotes in the next argument are necessary, the -o stands for 'options' and everything between the quotes are the actual database parameters which to start the Database with.*/ 
     "-o \"-p 15000\"", 
     "-l C:\\namewith space\\database\\postgres_db\\bin\\postgres_log.txt"); 

    File log = new File("\"C:\\folder\\log.txt\""); 
    pBuilder.redirectErrorStream(true); 
    pBuilder.redirectOutput(Redirect.appendTo(log)); 
    Process p = pBuilder.start(); 
    } catch (IOException ex) { 
     System.out.println("Exception Occurred: " + ex); 
    } 

到目前爲止我試過:

  • 周圍並沒有圍繞上述代碼中的每個/任何路徑,以防萬一(事情告訴我它...)。
  • 使用Runtime.getRuntime().exec("full command with/without any/all escaped quotes");方法,但搜尋時,SO,我發現每個人都在說,你應該使用的ProcessBuilder來代替。
  • 在ProcessBuiler的第一命令字符串不同的方式添加上述代碼的部分一起,像"\"C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe\" start"
  • 這些文件100%位於給定的路徑,我的手和通過在文件資源管理器中粘貼的路徑檢查這超過10次。
  • 分裂的命令到命令的工作目錄設定爲C:\ namewith空間\,然後加入ARGS沒有那部分。

錯誤(通過System.out.println("Exception Occurred: " + ex);)我不斷收到是:產生java.io.IOException:不能運行程序「C:\ namewith空間\數據庫\ postgres_db \ BIN \ pg_ctl.exe」:文件名,目錄名稱或卷標語法不正確。

請讓我知道如果你需要任何多餘的部分/代碼,我會盡我所能提供它的細節。

+0

我不假設修復目錄名稱或創建符號鏈接到沒有空格的路徑是可行的選項?如果這些是你唯一的選擇,我不會感到驚訝。該錯誤消息看起來像是來自操作系統,而不是來自Java。 – dimo414

+0

更改dirName不是一個選項。但是,如果我在命令提示符中複製/粘貼完全相同的完整語句(包括引號),它就可以工作。如果你把它放在.bat文件中也可以。請告訴我更多關於什麼是syslink。 – OneBigOwnage

+0

[符號鏈接](https://www.google.com/search?q=windows+symlink)是一個文件,它只是指向磁盤上另一個位置的指針。 – dimo414

回答

0

試着打破這個問題。

首先剛纔讀的IOException異常引到一文件對象的絕對路徑,並調用存在()方法來檢查該文件確實存在,而JVM訪問它。

如果沒有工作,解決您的路徑或訪問權限。如果文件真的存在並且您可以訪問它,那麼創建沒有任何參數的ProcessBuilder ,只有絕對路徑到您的exe。

你現在不應該得到IOException。 然後逐個添加參數。如果你發現一個打破這個事情,然後修復參數(也許雙引號缺失),並進入下一個,直到你完成。

+0

創建一個新的File對象,其中包含我嘗試訪問的文件的路徑。 myFile.exists()返回true。所以程序可以訪問它,這是一件好事。然後添加相同的EXACT路徑(在路徑附近引用或不引用額外的引號)會返回IOException。 [輸出的屏幕截圖](http://i.imgur.com/Un4XNWF.png)。 – OneBigOwnage

+0

如果您在文件對象上調用getAbsolutePath()方法,並使用返回的字符串作爲命令,那麼這是否正常工作? – jllaneras

+0

這實際上正是我所做的:/創建一個新的'File'對象與該路徑,然後檢查該文件是否可以通過'myFile.exists()'代碼訪問,然後創建像新的ProcessBuilder(myFile的pBuilder。 getAbsolutPath())'沒有任何其他參數。 – OneBigOwnage