使用 java 調用 cmd 命令時,使用如下的代碼(不需要導入其他庫)
Runtime.getRuntime().exec(command); //command是需要運行的命令
但是呢,這樣是運行不了的,要進行異常處理,或者將其拋出:
//這里選擇異常處理
try {
Runtime.getRuntime().exec(command);
} catch (IOException e1) { // 改自己的異常類
e1.printStackTrace();
}
現在,可以運行exe文件,但是若運行 gpedit.msc devmgmt.msc 等工具無反應
解決辦法是,設定cmd的運行模式(這不是java的語法,是cmd的程序參數):
#轉至https://blog.csdn.net/liuyukuan/article/details/5974517
cmd /c command 執行完命令后關閉命令窗口。
cmd /k command 執行完命令后不關閉命令窗口。
cmd /c start command 會打開一個新窗口后執行命令,原窗口會關閉。
cmd /k start command 會打開一個新窗口后執行命令,原窗口不會關閉。
將命令改變后,就可以正常使用會彈出新窗口的工具了
但是,如果要調用出命令行及沒有圖型界面的工具或程序,則要用后面兩個命令,不然不會彈出。
例如:
Runtime.getRuntime().exec("cmd /c powershell"); // 無反應
Runtime.getRuntime().exec("cmd /c start powershell"); // 成功調出powershell
個人理解是: java會在后台運行一個終端,然后再運行輸入的代碼,但是這個終端是不會到前台的,所以沒圖形界面的程序雖然能運行,但是無法顯示.
等等,那要怎么獲取命令的返回值呢?
首先,Runtime.getRuntime().exec()會返回被調用的進程,我們需要獲取這個進程
接着,再通過輸入流,讓java程序讀取被調用程序的返回值,再將其輸出便可
例如:
/* 記得引入java.io中的相關包 */
// 獲取進程
Process process = Runtime.getRuntime().exec("cmd /c dir"); // 運行dir命令
// 獲取進程的輸入流 流的方向為(喚醒的進程 -> java程序)
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
// 若讀取當前行不為空,就將其輸出
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 將流關閉,避免浪費系統資源
reader.close();
此時,java程序就會打印出DIR命令的執行結果
但是注意,cmd不能加start參數,因為加上了會創建新的終端執行,java就得不到執行結果了
總結:
1. java運行可執行文件,隨意使用任意一種cmd運行方式
2. 執行 *.msc 類文件,cmd要加上start參數(也就是后兩種運行模式之一)開啟新窗口.
3. 想要得到運行的返回值,要先獲取到進程,再得到它的輸入流,並且cmd不能加上start參數,否則會在新的終端窗口執行.
個人感覺是:帶GUI程序任意,終端程序后兩種,要得到返回值的話前兩種
補充:
學生黨,單純做筆記使用,若有不足之處請指正,感激不盡!