2013-01-23 70 views
0

我需要執行一個net use命令,該命令寫入批處理文件以啓用驅動器。批處理文件如下:執行網絡使用命令

net use * /delete /Y 
net use l: \\<windows drive name> /user:<domain>\<username> <password> 

上面的批處理文件爲我啓用了一個驅動器,並將它作爲L:驅動器顯示給我。 我需要通過java代碼執行這個批處理文件,然後將一些文件寫入這個驅動器。

我使用下面的代碼來執行這個批處理文件:

String[] array = { "cmd", "/C", "start", "C:/file.bat" }; 
Runtime.getRuntime().exec(array); 

問題是,當我嘗試訪問驅動器將它給了我未發現異常路徑的文件。有時它運行,有時它不運行。

朋友們可以幫助我瞭解問題出在哪裏。我正在執行什麼錯誤的步驟。如果我不清楚我的問題,請告訴我。

回答

2

有時會運行,有時卻不會。

這看起來像是一種競爭條件。 Runtime.exec()在調用應用程序繼續運行的同時在單獨的進程中執行您的命令。然後,當您嘗試訪問該文件時,不確定該批處理文件是否已完成。

Runtime.exec()返回Process對象,您可以使用該對象與子流程進行通信。在你的情況下,它應該足以等待過程完成:

Process p = Runtime.getRuntime().exec(array); 
p.waitFor(); 

// Now, your batch file should be completed and you can continue 
// ... 
+0

這聽起來很合理! – demaniak

+0

@Andreas:謝謝你的回覆。它爲我工作。不過,我想在此更新一件事。我第一次運行它停滯的代碼,我不得不強行停止執行。之後,我重新運行它的代碼。我再次運行它,然後運行它。 因此,擔心的是我必須在應用程序中使用這個邏輯,我如何確保它在每次調用時都能運行。 –

+0

您需要添加某種監控才能確保該命令在特定時間範圍內完成,否則將終止並重新執行該命令。您可以將其添加到您的代碼中(例如通過實施Watchdog線程),但如果可能的話,我會查看@demaniak提到的Apache Commons Exec項目,該項目提供了這種開箱即用的監控。 –

2

我懷疑當命中實際命令外殼時,Windows不喜歡「/」。也許嘗試「\」來代替? 外部流程執行有點棘手 - 你可能想看看Apache Commons Exec project來幫助你。

+0

感謝Demaniak,我已經使用你的建議以及代碼。 –

+0

提及Apache Commons Exec項目+1 –