【问题标题】:Batch (.bat) called from Java does not fully execute从 Java 调用的批处理 (.bat) 未完全执行
【发布时间】:2017-03-08 01:11:16
【问题描述】:

我在 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 和直接从运行时运行,但其中任何一种都没有得到预期的结果。

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

提前致谢。

【问题讨论】:

  • 如果您打开命令行并键入 cmd /c test.bat 是否有效?如果是这样,那么可能工作目录设置不正确,可以通过执行 dir 开始,看看它是否显示 test.bat
  • @TheresaForster 是的,它执行 .bat 文件。我还使用 Java 中 File 类的 list() 方法来列出我试图从中调用 .bat 的目录的所有内容。它按预期打印所有文件,因此我认为目录已正确设置。我当然可能是错的,但如何证明它超出了我目前的 Java 知识范围。
  • 尝试运行 cmd /c 目录。什么节目?
  • 它输出卷标、卷序列号并列出目录中的当前文件(HelloWorld.java 和 test.bat),以及两个文件在磁盘中的总字节数.
  • 你为什么要运行cmd?如果直接执行bat会发生什么?

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


【解决方案1】:

我展示的代码。它运行良好。

最重要的是你应该阅读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");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2021-05-31
    • 2013-03-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多