从Java调用的批处理(.bat)无法完全执行

时间:2016-10-25 20:34:12

标签: java windows batch-file cmd java-7

我在Windows 8.1操作系统下工作。在里面我有一个名为 test.bat 的.bat文件,它只是执行一个echo命令:

echo "123" > output.txt

每当我从命令行(cmd.exe)运行文件时,它都会创建一个名为output.txt的文本文件,其中" 123"写入(我假设每次调用.bat时文件都不存在)。

每次从命令行调用它时,.bat运行正常,但是当我尝试从Java源代码调用它时,.bat不会执行,即使代码运行正常(或者似乎,因为没有显示警告或错误代码。)

我的Java源代码如下:

    import java.io.*;
    import java.util.*;

    public class HelloWorld {

        public static void main(String[] args) throws InterruptedException{
        try
        {
            List<String> command_args = Arrays.asList("cmd.exe", null , " "test.
            File dir =  new File("C:\\Users\\Administrador\\workspace\\test\\src\\test");
            String[] files = dir.list();
            Runtime.getRuntime().exec("cmd /c test.bat", null, new File("C:\\Users\\Administrador\\workspace\\test\\src\\test"));
            if( files.length == 0 )
            {
                System.out.println("Empty dir");

            }
            else
            {
                for( String f: files )
                {
                    System.out.println(f);      
                }       
            }

            ProcessBuilder pb = new ProcessBuilder( command_args );
            pb.directory(dir);
            Process proc = pb.start();
            //int error = proc.waitFor();
        }
        catch( IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
}

该文件名为 HelloWorld.java ,位于路径C:\ Users \ Administrador \ workspace \ test \ src \ test中。 代码的某些行用于列出变量dir引用的目录的内容,它确实指向正确的目录,因为代码的输出显示了目录中的文件(HelloWorld.java和test)。蝙蝠)。

如果我运行代码,它会正确打印目录内容,并且似乎执行100%的代码,但每次运行Java代码时都没有创建output.txt文件。我尝试了两种不同的方法从Java运行.bat,使用ProcessBuilder并直接从Runtime运行,但是其中任何一个都没有得到预期的结果。

您是否知道是否可以从Java中完全运行这种.bat,或者我是否需要使用特定的库?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我展示的代码。工作得很好。

最重要的是你应该阅读inputStream,否则可能无法成功。

waitFor()使主进程运行,直到.bat工作完成。

echo helloworld >>f:/2.txt 
exit

在f:/hello.bat

Process p;
    String cmd="cmd /c start f:\\hello.bat";
    try {

        p = Runtime.getRuntime().exec(cmd);
        InputStream in = p.getInputStream();
        int c;
        while ((c = in.read()) != -1) {
                System.out.print(c);
        }
        in.close();
        try {
                p.waitFor();
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
        System.out.println("done");

    } catch (IOException e) {
        System.out.println("play show error");
    }