1

我想用 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)。

4

3 回答 3

2

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

于 2012-04-18T07:52:36.780 回答
1

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

File currentDir

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

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

祝你好运。

于 2012-04-18T07:46:22.530 回答
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;
于 2012-04-18T08:29:01.613 回答