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

42

能否打开命令提示符(以及其他系统的终端),并在新打开的窗口中执行命令?

目前,我拥有的是这个:

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

我尝试在“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目录。


1
你能否澄清一下为什么你要这样做,而不是直接在Java命令上运行.exec。命令窗口会自动打开。 - Konstantin Komissarchik
看一下我在ktm5124的答案下发表的评论。 - 404 Not Found
9个回答

31

我知道人们建议避免使用rt.exec(String),但它确实可行,而且我不知道如何将其改为数组版本。

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

我正在做类似于你的事情,我很好奇/c和/k来自哪里。我似乎找不到有关cmd的提及。另外,为什么要转义引号?是因为中间的值代表要传递给CMD的命令吗? - Ungeheuer
3
cmd /?/C 执行由字符串指定的命令,然后终止。 /K 执行由字符串指定的命令,但保持窗口打开。 - 404 Not Found
三天的努力,终于可以对我起作用了,谢谢 :)))))))) - hassan moradnezhad

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

}

8
你可以删除代码中无关的评论并添加一些相关的注释。 - Aleksandr M

10
如果你正在同时运行两个命令,只是为了改变命令提示符运行的目录,那么可以使用Runtime.exec方法的重载来指定当前工作目录。例如,
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));

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

有一种方法可以将命令作为字符串或字符串数组进行重载。

你可能会发现更容易使用ProcessBuilder,它具有一个directory方法来设置当前工作目录。

希望这有所帮助。


它应该是runtime.exec("cmd.exe /c start", null, new File(newDir)); - ChanGan
1
我已经使用了以下代码:String newDir="C:\Test\Application\"; runtime.exec("cmd.exe /c start dir", null, new File(newDir)); 在这个文件夹下,如果我想运行一些命令,例如 C:\Test\Application\avt install - filename..,该怎么做呢?你能帮我吗? - ChanGan

4
以下内容适用于我在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"}

如果要在新的命令提示符中打开命令,则必须使用进程引用。但是,我不确定为什么您要这样做,因为您可以像上一个评论者所说的那样使用exec。


我想在新的命令提示符中打开命令的原因是,我要启动的程序是一个基于控制台的程序,其输入和输出分别来自和进入控制台。请注意,我要启动的程序不是我制作的,所以我必须根据它的工作方式进行编程,我无法更改它。 - 404 Not Found

2
你只需要在传递的字符串中,在“start”后面添加你的命令。
String command = "cmd.exe /c start "+"*your command*";

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

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

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

0
请将您的命令放在参数中,就像下面所示。
Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");

0

你必须仔细设置所有的\"(引号)。参数\k用于执行后保持命令提示符打开状态。

1) 要组合两个命令,请使用(例如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());

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接