404*_*und 38 java terminal command launch
是否可以打开命令提示符(我猜其他系统的任何其他终端),并在新打开的窗口中执行命令?
目前我拥有的是:
Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});
Run Code Online (Sandbox Code Playgroud)
我尝试在"开始"之后添加下一个命令,我尝试运行另一个包含我的命令的rt.exec,但我找不到让它工作的方法.
如果重要,我正在尝试运行类似于此的命令:
java -flag -flag -cp terminal-based-program.jar
Run Code Online (Sandbox Code Playgroud)
编辑不幸的是我有一些奇怪的发现.我已经能够成功启动命令提示符并使用以下命令传递命令:
rt.exec("cmd.exe /c start command");
Run Code Online (Sandbox Code Playgroud)
但是,它似乎只能使用一个命令.因为,如果我尝试使用这样的命令分隔符"cmd.exe/c start command&command2",则第二个命令将通过后台传递(如果我刚使用rt.exec("command2")的话;) .现在问题是,我意识到我需要更改运行命令提示符的目录,因为如果我只使用jar文件的完整路径,则jar文件会错误地从命令提示符的活动目录中读取数据,而不是jar的目录,包含其资源.
404*_*und 24
我知道人们建议远离rt.exec(String),但是这样可行,我不知道如何将其更改为数组版本.
rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
Run Code Online (Sandbox Code Playgroud)
如果一次运行两个命令只是为了更改运行命令提示符的目录,则Runtime.exec方法会出现重载,允许您指定当前工作目录.喜欢,
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));
Run Code Online (Sandbox Code Playgroud)
这将在newDir的目录中打开命令提示符.我认为您的解决方案也可以正常工作,但这会使您的命令字符串或数组更加清晰.
将命令作为字符串并将命令作为String数组有一个重载.
但是,您可能会发现使用ProcessBuilder更加容易,因为ProcessBuilder有一个directory方法来设置当前的工作目录.
希望这可以帮助.
小智 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());
}
}
Run Code Online (Sandbox Code Playgroud)