是否可以打开命令提示符(我猜其他系统的任何其他终端),并在新打开的窗口中执行命令?
目前我所拥有的是:
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的目录,包含其资源。
答案 0 :(得分:22)
我知道人们建议远离rt.exec(String),但这样做有效,我不知道如何将其更改为数组版本。
rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
答案 1 :(得分:8)
如果一次运行两个命令只是为了更改运行命令提示符的目录,则Runtime.exec方法会出现重载,允许您指定当前工作目录。像,
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));
这将在newDir的目录中打开命令提示符。我认为您的解决方案也可以,但这可以使您的命令字符串或数组更清晰。
将命令作为字符串并将命令作为String数组存在重载。
但是,您可能会发现使用ProcessBuilder更加容易,{{3}}具有directory
方法来设置您当前的工作目录。
希望这有帮助。
答案 2 :(得分:8)
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());
}
}
答案 3 :(得分:3)
以下适用于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”}
要在新命令提示符中打开命令,您必须使用Process引用。但是我不确定你为什么要这样做才能使用exec,就像我面前的人所评论的那样。
答案 4 :(得分:2)
您只需要在开始后在您传递的字符串中附加命令。
String command = "cmd.exe /c start "+"*your command*";
Process child = Runtime.getRuntime().exec(command);
答案 5 :(得分:0)
请将命令放在如下所述的参数中。
Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
答案 6 :(得分:0)
您可以在命令提示符
上使用任何on进程获取动态路径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");
答案 7 :(得分:0)
您必须仔细设置所有\"
(引号)。参数\k
用于使命令提示符在执行后保持打开状态。
1)组合使用2条命令(例如pause
和ipconfig
)
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());
一个嵌套的引号\“用于命令和文件名,第二个引号\”用于文件名本身,特别是名称中的空格等。
答案 8 :(得分:0)
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();