我想要做的是从java应用程序多次运行batch
文件。因此,我设置了运行此代码for-loop
次的n
:
for (int i = 0; i < n; i++) {
Runtime.getRuntime().exec("cmd /c start somefile.bat");
}
问题是现在每次运行命令时都会弹出一个新的cmd窗口。但是,我想要的只是在开头弹出的一个窗口,用于显示以下命令调用中的所有数据。
我该怎么做?
答案 0 :(得分:21)
使用&amp;&amp; ,您可以一个接一个地执行多个命令:
Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");
使用多个命令和条件处理符号
您可以使用条件处理符号从单个命令行或脚本运行多个命令。当您使用条件处理符号运行多个命令时,条件处理符号右侧的命令将根据条件处理符号左侧的命令结果进行操作。
例如,您可能只想在上一个命令失败时运行命令。或者,您可能只想在上一个命令成功时运行命令。 您可以使用下表中列出的特殊字符来传递多个命令。
& [...] command1 & command2
用于在一个命令行上分隔多个命令。 Cmd.exe运行第一个命令,然后运行第二个命令。
&& [...] command1 && command2
用于运行&amp;&amp ;;之后的命令仅当符号前面的命令成功时。 Cmd.exe运行第一个命令,然后仅在第一个命令成功完成时运行第二个命令。
|| [...] command1 || command2
用于在||后面运行命令只有前面的命令是||失败。 Cmd.exe运行第一个命令,然后仅在第一个命令未成功完成时才运行第二个命令(收到大于零的错误代码)。
( ) [...] (command1 & command2)
用于分组或嵌套多个命令。
; or , command1 parameter1;parameter2
用于分隔命令参数。
答案 1 :(得分:14)
我会使用Java的ProcessBuilder或其他模拟/使用shell的类。以下片段演示了这个想法(对于Linux使用bash)。
import java.util.Scanner;
import java.io.*;
public class MyExec {
public static void main(String[] args)
{
//init shell
ProcessBuilder builder = new ProcessBuilder( "/bin/bash" );
Process p=null;
try {
p = builder.start();
}
catch (IOException e) {
System.out.println(e);
}
//get stdin of shell
BufferedWriter p_stdin =
new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
// execute the desired command (here: ls) n times
int n=10;
for (int i=0; i<n; i++) {
try {
//single execution
p_stdin.write("ls");
p_stdin.newLine();
p_stdin.flush();
}
catch (IOException e) {
System.out.println(e);
}
}
// finally close the shell by execution exit command
try {
p_stdin.write("exit");
p_stdin.newLine();
p_stdin.flush();
}
catch (IOException e) {
System.out.println(e);
}
// write stdout of shell (=output of all commands)
Scanner s = new Scanner( p.getInputStream() );
while (s.hasNext())
{
System.out.println( s.next() );
}
s.close();
}
}
请注意,它只是一个片段,需要针对Windows进行调整,但一般情况下它应与cmd.exe
一起使用。
答案 2 :(得分:1)
@Jost我很抱歉,但我不允许发表评论。我仍然需要50个声望。 您提供的解决方案是完美的。我搜索了很长时间。 我只是为Windows编写了一些测试类,并且一切都可以完美地工作。非常感谢。
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
private BufferedWriter p_stdin;
public Main() {
// init shell
ProcessBuilder builder = new ProcessBuilder("C:/Windows/System32/cmd.exe");
Process p = null;
try {
p = builder.start();
} catch (IOException e) {
System.out.println(e);
}
// get stdin of shell
p_stdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
// execute commands
executeCommand("@echo off");
executeCommand("cd rsc");
executeCommand("exit");
// write stdout of shell (=output of all commands)
Scanner s = new Scanner(p.getInputStream());
while (s.hasNext()) {
System.out.println(s.next());
}
s.close();
}
private void executeCommand(String command) {
try {
// single execution
p_stdin.write(command);
p_stdin.newLine();
p_stdin.flush();
} catch (IOException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
new Main();
}
}
答案 3 :(得分:0)
public void TestCommandRun(){
Process process = null;
String[] command_arr = new String[]{"cmd.exe","/K","start"};
ProcessBuilder pBuilder = new ProcessBuilder("C:/Windows/System32/cmd.exe");
try{
process = pBuilder.start();
}
catch(IOException e){
e.printStackTrace();
System.out.println("Process failed");
}
if(null != process){
OutputStream out = process.getOutputStream();
OutputStreamWriter outWriter = new OutputStreamWriter(out);
BufferedWriter bWriter = new BufferedWriter(outWriter);
try{
bWriter.write("dir");
bWriter.newLine();
bWriter.write("ipconfig");
bWriter.flush();
bWriter.close();
}
catch(IOException e){
e.printStackTrace();
System.out.println("bWriter Failed");
}
}
}