【问题标题】:How to execute a batch file from java?如何从java执行批处理文件?
【发布时间】:2009-09-14 12:05:11
【问题描述】:

我想从 java 程序中执行一个批处理文件。

我正在使用以下命令。

Runtime.getRuntime().exec("server.bat");

但问题是我想给出一个反应路径而不是绝对路径,这样我就可以在任何计算机上部署该 java 项目。

项目的dir结构如下:

com
   |
  project
   |
   ------ parser
   |         |_____ Main.java
   |
   -------util
             |_____ Server.bat

我想从“parser”目录中的“Main.java”文件中运行“util”目录中的“Server.bat”文件。

【问题讨论】:

    标签: java batch-file


    【解决方案1】:

    您可以为此使用ProcessBuilder。它提供了比exec 更多的控制。特别是,它允许使用方法directory设置工作目录。

    例子:

    ProcessBuilder pb = new ProcessBuilder("server.bat");
    pb.directory(new File(deployDir + "\\com\\project\\util"));
    Process p = pb.start();
    int exitStatus = p.waitFor();
    

    当然,您的应用必须从某个地方获取 deployDir。它可以在环境中设置,在应用程序配置文件中,可以是当前用户目录或其他任何东西。

    【讨论】:

      【解决方案2】:

      您必须使用参数“/c”和“server.bat”运行“cmd.exe”:

      Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );
      

      【讨论】:

        【解决方案3】:

        当 Java 正在运行并且您使用带有相对路径的 Runtime.exec() 时,相对意味着相对于调用 JVM 的当前用户目录。

        这可能有效

        Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat");
        

        如果你从 com 的父目录启动 java。

        或者你必须计算一个绝对路径:

        Runtime.getRuntime().exec("cmd.exe", "/c", 
        System.getProperty("user.dir")+"/com/projct/util/server.bat");
        

        我忘了,看When Runtime.exec() won't

        【讨论】:

        • Runtime 类中没有采用三个字符串参数的“exec”方法。
        • 确实如此。我的意思是 String[] 版本,但我无法在 SO 文本框中输入方括号...我想我必须阅读 SO 手册/wiki ...
        • 可以说我有三个应该从 CMD 运行的命令,然后将为每个命令打开三个单独的 CMD 窗口,有没有办法可以在一个 CMD 窗口上执行所有三个命令..
        • @viveksinghggits 在这里阅读:stackoverflow.com/questions/8055371/…
        【解决方案4】:

        如果支持,您可以在 Desktop 上试用 (Java 1.6)

            File file = new File("server.bat");
            Desktop.getDesktop().open(file);
        

        【讨论】:

        • 这是唯一适合我的作品!谢谢
        【解决方案5】:

        Plexus utils 提供了一个命令行类型,可以调用任意命令行并处理输出解析。

        Commandline cl = new Commandline();
        
        cl.setExecutable( "cmd.exe" );
        cl.createArg().setValue( "/c" );
        
        cl.setWorkingDirectory( new File(System.getProperty("user.dir"), 
            "/com/project/util/Server.bat"));
        
        cl.createArg().setValue( "/c" );
        
        StreamConsumer consumer = new StreamConsumer() {
            public void consumeLine( String line ) {
                //do something with the line
            }
        };
        
        StreamConsumer stderr = new StreamConsumer() {
            public void consumeLine( String line ) {
                //do something with the line
            }
        };
        
        int exitCode;
        
        try {
            exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
        } catch ( CommandLineException ex ) {
            //handle exception
        }
        

        【讨论】:

          【解决方案6】:

          最好的办法是将应用程序的安装目录存储在系统上,然后使用该目录在应用程序中构建路径。 System.getProperty("user.dir") 应该在 Windows 和 Unix 平台上工作以获取当前工作目录,但它取决于系统,因此请注意这一点。

          【讨论】:

            【解决方案7】:

            exec 的第二个参数是环境设置的 args 的 String[](null 表示继承进程的当前参数),exec 的第三个参数应该是提供工作目录的文件。试试这个:

            Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));
            

            【讨论】:

              猜你喜欢
              • 2017-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-03
              • 2016-09-09
              • 2012-12-26
              • 1970-01-01
              相关资源
              最近更新 更多