如何使用Java打开命令提示符并插入命令?

时间:2011-01-14 05:00:55

标签: java command terminal launch

是否可以打开命令提示符(我猜其他系统的任何其他终端),并在新打开的窗口中执行命令?

目前我所拥有的是:

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的目录,包含其资源。

9 个答案:

答案 0 :(得分:22)

我知道人们建议远离rt.exec(String),但这样做有效,我不知道如何将其更改为数组版本。

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");

答案 1 :(得分:8)

如果一次运行两个命令只是为了更改运行命令提示符的目录,则Runtime.exec方法会出现重载,允许您指定当前工作目录。像,

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

这将在newDir的目录中打开命令提示符。我认为您的解决方案也可以,但这可以使您的命令字符串或数组更清晰。

将命令作为字符串并将命令作为String数组存在重载。

但是,您可能会发现使用ProcessBuilder更加容易,{{3}}具有directory方法来设置您当前的工作目录。

希望这有帮助。

答案 2 :(得分:8)

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());
    }

}

答案 3 :(得分:3)

以下适用于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不会将您的参数顺序解释为“启动新的命令提示符”。您的数组应该是:

{“start”,“cmd.exe”,“\ c”}

要在新命令提示符中打开命令,您必须使用Process引用。但是我不确定你为什么要这样做才能使用exec,就像我面前的人所评论的那样。

答案 4 :(得分:2)

您只需要在开始后在您传递的字符串中附加命令。

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

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

答案 5 :(得分:0)

请将命令放在如下所述的参数中。

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

答案 6 :(得分:0)

您可以在命令提示符

上使用任何on进程获取动态路径
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");

答案 7 :(得分:0)

您必须仔细设置所有\"(引号)。参数\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());

一个嵌套的引号\“用于命令和文件名,第二个引号\”用于文件名本身,特别是名称中的空格等。

答案 8 :(得分:0)

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();