Java - Exec控制台

时间:2012-04-18 07:18:24

标签: java console cmd exec runtime.exec

我想用Java创建一个完整的跨平台控制台。

我遇到的问题是当我使用cd命令时,路径被重置。例如,如果我执行cd bin,然后cd ../,我将从我的应用程序目录执行第一个,第二个执行完全来自同一目录。

如果我想去特定文件夹并执行程序,我必须做类似的事情:

cd C:\mydir & cd bin & start.exe

我想要做的是将此cmd拆分为不同的部分:

cd C:\mydir然后cd bin然后start.exe

我该怎么做?有没有办法存储当前的cd路径然后使用它?


以下是我使用的代码:

String[] cmd_exec = new String[] {"cmd", "/c", cmd};

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

BufferedReader in = new BufferedReader(new InputStreamReader(child.getInputStream()));
StringBuffer buffer = new StringBuffer();
buffer.append("> " + cmd + "\n");

String line;
while ((line = in.readLine()) != null)
{
    buffer.append(line + "\n");
}
in.close();
child.destroy();
return buffer.toString();

执行命令,然后返回控制台的内容。 (目前这是针对Windows的。)

3 个答案:

答案 0 :(得分:2)

如果要从特定目录运行命令,请使用ProcessBuilder代替Runtime.exec。在开始此过程之前,可以使用directory方法设置工作目录。不要尝试使用cd命令 - 你没有运行shell,所以它没有意义。

答案 1 :(得分:1)

如果你做cd,你不想执行它。您只想检查相对路径是否存在,然后更改

File currentDir

到该目录。所以我建议你把你的命令分成三个:cd,dir / ls和其他东西。 cd改变dir,正如我所提到的,通过使用File currentDir,dir应该只获取currentDir的文件夹和文件并列出它们,然后你应该按照你所知的那样执行其余的。

请记住,您可以通过“”.split(“&”)拆分命令字符串;这样你可以做“cd C:\ mydir& cd bin& start.exe”.split(“&”); => {“cd C:\ mydir”,“cd bin”,“start.exe”}然后您可以按顺序执行它们。

祝你好运。

答案 2 :(得分:1)

感谢Mads,我能够做到这一点:

以下是我使用的代码:

if (cmd.indexOf("cd ") >= 0)
{
    String req_cmd = cmd.substring(0, 3);
    String req_path = cmd.substring(3);
    if (req_path.startsWith(File.separator) || req_path.substring(1, 2).equals(":"))
        path = req_path;
    else
        if (new File(path + cmd.substring(3)).exists())
            path += cmd.substring(3);
        else return "[Error] Directory doesn't exist.\n";

    if (!path.endsWith(File.separator)) path += File.separator;

    cmd = req_cmd + path;
}
else cmd = "cd " + path + " & " + cmd;

然后你可以执行命令调用:

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

不要忘记在班级中添加此属性:

private static String path = System.getProperty("user.dir") + File.separator;