所以我花了半個一個一天試圖讓這沒有陽性結果的工作。我正在使用一個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」:文件名,目錄名稱或卷標語法不正確。
請讓我知道如果你需要任何多餘的部分/代碼,我會盡我所能提供它的細節。
我不假設修復目錄名稱或創建符號鏈接到沒有空格的路徑是可行的選項?如果這些是你唯一的選擇,我不會感到驚訝。該錯誤消息看起來像是來自操作系統,而不是來自Java。 – dimo414
更改dirName不是一個選項。但是,如果我在命令提示符中複製/粘貼完全相同的完整語句(包括引號),它就可以工作。如果你把它放在.bat文件中也可以。請告訴我更多關於什麼是syslink。 – OneBigOwnage
[符號鏈接](https://www.google.com/search?q=windows+symlink)是一個文件,它只是指向磁盤上另一個位置的指針。 – dimo414