我想用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的。)
答案 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;