最近我正在嘗試編寫一個Java應用程序來調用SCM.exe來執行代碼加載作業。但是,在通過java成功執行SCM load命令後,我發現我實際上無法真正下載代碼(如使用命令行,需要在執行SCM load命令後輸入密碼)。我是否可以知道在我使用該過程在java中運行SCM之後如何輸入此密碼?如何獲得命令行的輸出並在命令行中輸入內容?通過JAVA應用程序調用SCM
萬分感謝, 埃裏克
最近我正在嘗試編寫一個Java應用程序來調用SCM.exe來執行代碼加載作業。但是,在通過java成功執行SCM load命令後,我發現我實際上無法真正下載代碼(如使用命令行,需要在執行SCM load命令後輸入密碼)。我是否可以知道在我使用該過程在java中運行SCM之後如何輸入此密碼?如何獲得命令行的輸出並在命令行中輸入內容?通過JAVA應用程序調用SCM
萬分感謝, 埃裏克
因爲我不知道到底是什麼SCM.exe你的情況是,我回答,在抽象意義上的輸入/輸出重定向的要求僅涉及什麼。我進一步假設你正在通過System(「...」)調用它需要的任何參數的SCM.exe,這是你無法通過任何進一步輸入(被調用進程的標準輸入)的地方。
您需要在接收到密碼請求時將其傳遞給另一個進程的stdin,這通過使用傳統意義上的管道來解決(因爲您大概在Windows上,YMMV )。更一般地說,你正在處理一個非常簡單的IPC案例。在Java中,你可以通過使用ProcessBuilder [1]找到一個合適的解決方案(雖然我從來沒有這樣做過 - 爲了這個目的,我使用的東西比java簡單得多,但我離題了......)。
溶液的概要是:
如果您需要進一步說明,您可能需要提供有關您的方案的更多詳細信息。
[1] http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html
公共類的測試{ 公共靜態無效的主要(字串[] args){
try {
System.out.println("");
String commands = "C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe load -d C:/users/43793207/test -i test -r eric-repo";
// load -d C:/users/43793207/test -i test -r eric-repo
test test=new test();
test.execCommand(commands);
} catch (Exception e) {
e.printStackTrace();
}
}
public void execCommand(String commands){
//ProcessBuilder pb = new ProcessBuilder(Command);
//pb.start();
String line;
try {
//Process pp = Runtime.getRuntime().exec(commands);
System.out.println(commands);
Process process = new ProcessBuilder(commands).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
這個代碼有一個錯誤,當我輸入命令如「C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe」時,它會運行順利。但是當我輸入「C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe加載-d C:/用戶/ 43793207/test -i測試-r eric-repo」等附加參數時,它會觸發一個錯誤,「CreateProcess error = 2,系統找不到指定的文件」,任何機構都可以提出任何解決方案來解決它? –
正如ProcessBuilder文檔中所述(鏈接在我的上面的答案中)以及通過參數啓動其他進程的常用方式,您的進程的每個參數(從'load -d'開始的所有內容)都將作爲附加字符串傳遞。您調用的方式將'C:'到'eric-repo'(包含空格)作爲可執行文件路徑。參考SO中的其他答案可以得出同樣的結論。此外,根據常規慣例(即測試,而不是測試)來命名您的課程將是一種很好的做法。 – h7r
非常感謝您的建議:) –
我已經找到了解決方案來解決它,非常感謝 –
請問你介意(或描述)你的解決方案(可能是對原始問題的編輯),以便對此問題感興趣的其他人可以將其作爲參考。 – h7r
請在下面看到我的回覆,謝謝你的幫助 –