41

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

目前我所拥有的是:

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 目录。

4

9 回答 9

28

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

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
于 2011-01-15T04:10:31.910 回答
10

如果您同时运行两个命令只是为了更改命令提示符所在的目录,则 Runtime.exec 方法有一个重载,可让您指定当前工作目录。喜欢,

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

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

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

不过,您可能会发现使用ProcessBuilder更容易,它有一种directory设置当前工作目录的方法。

希望这可以帮助。

于 2011-01-16T04:57:43.210 回答
10
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());
    }

}
于 2012-06-11T18:10:33.890 回答
4

以下适用于雪豹:

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 时,我不确定您为什么要这样做。

于 2011-01-14T05:47:30.507 回答
2

你只需要在你传递的字符串中添加你的命令。

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

Process child = Runtime.getRuntime().exec(command);
于 2017-05-10T07:13:03.990 回答
1
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();
于 2019-02-07T05:37:48.093 回答
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());

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

于 2019-01-18T09:16:53.437 回答
0

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

Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
于 2017-12-23T16:01:23.733 回答
0

您可以在命令提示符下将任何进程用于动态路径

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");
于 2018-04-26T07:04:54.567 回答