JAVA执行批处理文件的解决方案

Java是种跨平台的语言,我们经常碰到需要通过Java调用windows下某些程序。有些第三方厂商如(ANT),也提供了调用windows下可执行程序的方法,但我们往往需要调用一些批处理命令。而Java却不提供。这里,我采用一种变相的调用方法,使得Java能调用批处理命令。

工具/原料

  • Quick Batch File (De)Compiler

步骤/方法

  1. 运行exe 文件。

    Java JDK里已经提供了调用的方法,不在累赘,代码如下。

    try {

    String command = "notepad";

    Process child =

    Runtime.getRuntime().exec(command);

    } catch (IOException e)

    {

    }

  2. 运行 bat(批处理) 文件。

    Java对批处理文件还不支持。刚开始一直在研究Java如何调用批处理文件,始终找不到解决方法。后来只好绕过批处理,考虑如何将批处理转换为exe可执行文件。然后再通过Java调用可执行文件。

    在Google上搜索一下,找到Quick Batch File (De)Compiler,可以将任何BAT、CMD批处理脚本编译为EXE文件。使用了一下,果然可以。

    Quick Batch File (De)Compiler使用非常简单:

    Quickbfc 文件名.bat 文件名.exe(将批处理命令编译为可执行文件)

    quickbfd 文件名.exe 文件名.bat(将可执行文件反编译为批处理命令)

    然后,我们再按第一种方法通过Java 调用,即可。

    BeanSoft 的实践备注:

    因为我要实现调用其他目录里面的 BAT 文件, 具体说就是 Tomcat 的 startup.bat 文件, 目前可以证明的是如果程序启动目录位于 Tomcat 的 bin 目录下, 调用批处理文件没有问题, 而如果不在那个目录来调用 startup.bat, 那么就算使用 Quick Batch File (De)Compiler 也不能正常运行 BAT, 原因就是当前路径不对. OK, 问题集中在如何设置当前路径下了.

    我们看看批处理环境的 start 的用法:

    start /?

    启动另一个窗口运行指定的程序或命令。

    START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]

    [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]

    [/WAIT] [/B] [command/program]

    [parameters]

    "title" 在窗口标题栏中显示的标题。

    path 起始目录

    B 在不创建新窗口的情况下开始应用程序。 除非

    启动 ^C 处理,否则该应用程序会忽略 ^C 处理;

    ^Break 是唯一可以中断该应用程序的方式

    I 新环境是传递给 cmd.exe 的原始环境,

    而不是当前环境

    MIN 开始时窗口最小化

    MAX 开始时窗口最大化

    SEPARATE 在分开的空间内开始 16 位 Windows 程序

    SHARED 在分共享的空间内开始 16 位 Windows 程序

    LOW 在 IDLE 优先级类别开始应用程序

    NORMAL 在 NORMAL 优先级类别开始应用程序

    HIGH 在 HIGH 优先级类别开始应用程序

    REALTIME 在 REALTIME 优先级类别开始应用程序

    ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序

    BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序

    WAIT 启动应用程序并等候它结束

    command/program

    如果是内部 cmd 命令或批文件,那么该命令处理器是

    用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行

    后仍然存在。

    如果不是内部 cmd 命令或批文件,则是一个程序,并

    作为窗口应用程序或控制台应用程序运行。

    parameters 这些为传送到命令/程序的参数

    如果命令扩展名被启用,通过命令行或 START 命令的外部命令

    调用会如下改变:

    将文件名作为命令键入,非可执行文件 可以通过文件关联调用。

    (例如, WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。

    关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和

    FTYPE 命令。

    执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用

    程序终止就返回命令提示。如果在命令脚本内执行,该新行为

    则不会发生。

    如果执行的命令行的第一个符号是不带扩展名或路径修饰符的

    字符串 "CMD","CMD" 会被COMSPEC 变量的数值所替换。这

    防止从当前目录抓出 CMD.EXE。

    如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用

    PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展

    名。PATHEXT 变量的默认值是:

    .COM;.EXE;.BAT;.CMD

    请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。

    查找可执行文件时,如果没有相配的扩展名,看一看该名称是否

    与目录名相配。如果确实如此,START 会在那个路径上调用

    Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

    可以看到 /Dpath 选项可以指定当前目录下运行, 所以最后通过运行的命令语句就是:

    cmd /c start /D"D:\Tomcat5.0\bin\" startup.bat, OK, 问题成功解决.

    代码:

    ?123456789101112131415161718192021222324</p><p align="left">/**@(#)TestRun.java1.002005-7-21**Copyright2006beansoft@126.com.Allrightsreserved.*PROPRIETARY/CONFIDENTIAL.Useissubjecttolicenseterms.*//***/ /***TestRun,测试执行批处理文件.* @author BeanSoft* @version 1.002005-7-21*/public classTestRun {public static voidmain(String[]args) {try {Runtime.getRuntime().exec( " cmd/cstart/D\ "D:\\Tomcat5. 0\\bin\\\ " startup.bat ");} catch(Exceptione) {e.printStackTrace();}}}</p><p align="left">0