如何在Java中的一个cmd窗口中运行多个命令?

时间:2013-09-18 07:37:33

标签: java for-loop batch-file windows-runtime

我想要做的是从java应用程序多次运行batch文件。因此,我设置了运行此代码for-loop次的n

for (int i = 0; i < n; i++) {
    Runtime.getRuntime().exec("cmd /c start somefile.bat");
}

问题是现在每次运行命令时都会弹出一个新的cmd窗口。但是,我想要的只是在开头弹出的一个窗口,用于显示以下命令调用中的所有数据。

我该怎么做?

4 个答案:

答案 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");
            }
            
        }
    }