2011-02-27 52 views
1

我嘗試在java中運行批處理文件,但是文件不完全運行。代碼看起來像:Java和多行批處理文件

Runtime.getRuntime().exec("cmd /c call "+path); 

當我嘗試手動運行它,沒有java,批處理工作正確。

批處理文件包含下面的代碼:

cd C:\Downloads\ 
if not exist Documents mkdir Documents 
move *.odt Documents 
move *.doc Documents 
if not exist Archives mkdir Archives 
move *.tar Archives 
move *.gz Archives 
if not exist Music mkdir Music 
move *.mp3 Music 

Java的整批只有第五行。有沒有人遇到過這個?


嗯,有batch,再次here採空。和Java代碼:link。如果添加到somename.ogg下載文件夾,腳本將轉到下一行。所有文件夾(檔案,文件等)已經存在,並且下載文件夾不包含* .zip,* .tar,* .docx,* pdf文件,但是這些行通過沒有問題。爲什麼它準確地停在ogg-line?

+0

你是否在'exec(...)'返回的進程上調用'waitFor()'? – Kru 2011-02-27 11:35:34

+0

如果我使用它,過程沒有完成( – strizhechenko 2011-02-27 16:42:04

回答

0

我下注path在您的Java程序中包含空格或類似內容。你是否正確引用了?

BTW:的Runtime.exec()已superseeded用的ProcessBuilder可以處理的參數比的Runtime.exec()

更好試試這個:

 
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call \"" + path "\""); 
builder.start(); 
+0

空格沒有問題,因爲批處理開始運行,並且將* .odt和* .doc移動到文檔,問題從第二個「if」語句開始。 – strizhechenko 2011-02-27 12:35:35

+0

此外您的變種 – strizhechenko 2011-02-27 14:02:49

+0

我錯過了'call'命令,修正了它 – 2011-02-27 14:06:17

1

我認爲問題是,有批處理腳本中的一個錯誤。該MSDN documentationif指示狀態如下:

不能使用,如果命令直接測試目錄,但空(NUL)設備並在每一個目錄中。因此,您可以測試空設備以確定目錄是否存在。一個目錄是否存在下面的示例測試:

if exist c:\mydir\nul goto process

現在你正在使用它的方式(if not exist directory mkdir directory)是有可能成功,如果目錄不存在...但嘗試創建該目錄第二次,如果它確實存在。噢...


現在,Java應用程序讀取並打印出的過程中錯誤流的內容,你很可能會看到一個錯誤信息,告訴您Archives目錄已經存在。國際海事組織忽略輸出是要求麻煩。

+0

如果存在c:\ mydir \ nul返回false(輸出:http://pastebin.com/8Bm2c2FH – strizhechenko 2011-02-27 14:16:48

+0

@panzersoldat - 所以你改變了你編碼讀取和打印輸出的過程呢? – 2011-02-27 14:27:52

0

OMG,GUYS!

我不明白爲什麼,但:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\""); 
builder.start(); 

不工作,但:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\""); 
BufferedReader br = new BufferedReader(new InputStreamReader(builder.start().getInputStream())); 
String line; 
while ((line=br.readLine())!=null) { 
    System.out.println(line); 
} 

工作正常! %)

如果有人明白這一點,請解釋一下。

+0

看起來好像當你的Java程序完成並被殺死後,你的過程還沒有完成,或者過程想要輸出某些東西而不能輸出(因爲你沒有做過, t讀它),因此在讀等待成功。 – 2011-02-27 16:05:50

+0

歡迎來到SO,不要發佈一個新的答案給你自己的問題,請編輯你的問題,而不是。 – 2011-02-28 09:51:26

0

如果你不小心你的stdout和stderr流很容易死鎖ProcessBuilder或Runtime.exec()。文章When Runtime.exec() won't在JavaWorld上包含了很多關於這個和其他一些陷阱的有用信息。

如果可能的話,我會建議使用Commons Exec,因爲所有需要的流體泵送都是爲您完成的。