簡體   English   中英

如何使用Java打開命令提示符並插入命令?

[英]How to open the command prompt and insert commands using Java?

是否可以打開命令提示符(我猜其他系統的終端),並在新打開的窗口中執行命令?

目前我所擁有的是:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});

我嘗試在“開始”之后添加下一個命令,我嘗試運行另一個包含我的命令的rt.exec,但是我找不到使它工作的方法。

如果很重要,我正在嘗試運行與此類似的命令:

java -flag -flag -cp terminal-based-program.jar

編輯不幸的是,我有一些奇怪的發現。 我已經能夠成功啟動命令提示符並使用以下命令傳遞命令:

rt.exec("cmd.exe /c start command");

但是,它似乎只適用於一個命令。 因為,如果嘗試使用這樣的命令分隔符“ cmd.exe / c start command&command2”,則第二條命令將通過后台傳遞(如果我僅使用rt.exec(“ command2”);的方式) 。 現在的問題是,我意識到我需要更改命令提示符運行所在的目錄,因為如果我僅使用jar文件的完整路徑,則jar文件會錯誤地從命令提示符的活動目錄中讀取數據,而不是包含其資源的jar目錄。

我知道人們建議不要使用rt.exec(String),但這是可行的,而且我不知道如何將其更改為數組版本。

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
public static void main(String[] args) {
    try {
        String ss = null;
        Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
        BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        writeer.write("dir");
        writeer.flush();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("Here is the standard output of the command:\n");
        while ((ss = stdInput.readLine()) != null) {
            System.out.println(ss);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((ss = stdError.readLine()) != null) {
            System.out.println(ss);
        }

    } catch (IOException e) {
        System.out.println("FROM CATCH" + e.toString());
    }

}

如果一次運行兩個命令只是為了更改命令提示符運行所在的目錄,則Runtime.exec方法有一個重載,可用於指定當前工作目錄。 喜歡,

Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));

這將在newDir的目錄中打開命令提示符。 我認為您的解決方案也能正常工作,但這可以使您的命令字符串或數組更簡潔。

將命令作為字符串並將命令作為字符串數組存在重載。

但是,使用ProcessBuilder可能會更容易,它具有用於設置當前工作目錄的directory方法。

希望這可以幫助。

以下是我在Snow Leopard上的工作:

Runtime rt = Runtime.getRuntime();
String[] testArgs = {"touch", "TEST"};
rt.exec(testArgs);

問題是,如果您想讀取該命令的輸出,則需要讀取流程的輸入流。 例如,

Process pr = rt.exec(arguments);
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));

使您可以輕松讀取命令的逐行輸出。

問題可能還在於MS-DOS不會解釋您的參數順序以表示“啟動新命令提示符”。 您的數組可能應該是:

{“開始”,“ cmd.exe”,“ \\ c”}

要在新的命令提示符下打開命令,您必須使用Process參考。 但是我不確定在您只可以使用exec時為什么要這么做,正如我之前的人所說。

您只需在啟動后在傳遞的字符串中附加命令。

String command = "cmd.exe /c start "+"*your command*";

Process child = Runtime.getRuntime().exec(command);

請把您的命令放在如下所述的參數中。

Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");

您可以在命令提示符下將任何進程用於動態路徑

Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");

您必須仔細設置所有\\" (引號)。參數\\k用於在執行后使命令提示符保持打開狀態。

1)結合使用2條命令(例如pauseipconfig

Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());

2)顯示文件使用的內容( MORE是Windows上的命令行查看器)

File selectedFile = new File(pathToFile):
Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());

嵌套引號\\“用於命令和文件名,第二個引號\\”用於文件名本身,尤其是名稱中的空格等。

String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig 
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM