我在做一个CLI。可以从每个选项中选择多个选项,执行一个“runnable-jar”文件。一切都如期而至。有一个选项是“退出计划”。问题是,当选择退出方案选项时,程序将按预期停止,但尽管放置了“退出”,cmd窗口仍未关闭。目标环境是Java1.7的Windows 2012
请帮助如何实现这一点?
下面是这个项目的样本。
J:\Generated>java -jar MainMenu.jar
--------------------------------------
ConnectAnalyzer
--------------------------------------
Enter option:
1. Send Email
2. sss
3. Exit Programme
[]--cursor is here 这就是按3时会发生的情况。
J:\Generated>exit
Return code = 1
J:\Generated>[]--cursor is here 下面是MainMenu.java的来源。这条线起作用
stdin.println("cmd.exe /c start exit");如预期的那样。打开cmd提示符并在瞬间关闭它。
package com;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
class SystemProcess implements Runnable
{
public SystemProcess(InputStream istrm, OutputStream ostrm) {
istrm_ = istrm;
ostrm_ = ostrm;
}
public void run() {
try
{
final byte[] buffer = new byte[1024];
for (int length = 0; (length = istrm_.read(buffer)) != -1; )
{
ostrm_.write(buffer, 0, length);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private final OutputStream ostrm_;
private final InputStream istrm_;
}
public class MainMenu {
public static void main(String[] args) throws Exception
{
boolean status = true;
while(status){
System.out.println("");
System.out.println("---------------------------------------------------------------------------");
System.out.println("");
System.out.println("ConnectAnalyzer");
System.out.println("---------------------------------------------------------------------------");
System.out.println("Enter option: ");
System.out.println("1. Send Email");
System.out.println("2. sss");
System.out.println("3. Exit Programme");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String option = null;
option = br.readLine();
int i = Integer.parseInt(option);
switch(i){
case 1: {
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start exec.bat");
}
;break;
case 2:System.out.println(i+"SUB");
break;
case 3:{
String[] command =
{
"cmd",
};
Process p = Runtime.getRuntime().exec(command);
new Thread(new SystemProcess(p.getErrorStream(), System.err)).start();
new Thread(new SystemProcess(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
// stdin.println("put whatever command you wish here");
// stdin.println("dir J:\\ /A /Q");
stdin.println("cmd.exe /c start exit");
// stdin.println("java -jar J:/Generated/Testimg.jar");
stdin.println("exit");
stdin.close();
int returnCode = p.waitFor();
System.out.println("Return code = " + returnCode);
System.exit(1);
}
default: System.out.println("Invalid Option. Try again");
break;
}
}
}
}我试过了
p.destroy();这不会关闭cmd提示符。
我看到的唯一选项是使用taskkill /PID <int_pid>,但我不知道如何获得pid。
发布于 2014-06-22 09:16:07
我认为从您的java代码中执行DOS命令exit应该有效。但是,只有当用户直接从先前打开的命令提示符窗口启动java程序时,这才是相关的。
我认为更明确的解决方案是在批处理文件级别解决这个问题。批处理文件应该运行您的java程序,并且当它终止时(可能使用预定义的退出代码-例如-1)执行exit。
https://stackoverflow.com/questions/24349776
复制相似问题