Lotus教程、Java教程、Java虚拟机、Java软件综合开发社区

Lotus、Domino、Java、C#、Web、数据库综合开发教程、资料社区

[转载]Java 执行批处理文件的解决方案



Published by admin on 03月 11, 2008

批处理文件不同于一般的可执行文件,批处理只是一系列命令脚本,他的运行要依靠解释他的程序,而你要创建的也应该是这个解释程序,用下面的办法试试:

Process process = Runtime.getRuntime(”cmd /c mybat.bat”);

注意:确保系统能够找到 mybat.bat 文件,安全的做法是你指明完整的路径。

是bat的话,在java类中
Runtime run = Runtime.getRuntime();
run.exec(”cmd /c start c:/my.bat”);

最终解决方案:

  Java是种跨平台的语言,我们经常碰到需要通过Java调用windows下某些程序。有些第三方厂商如(ANT),也提供了调用windows下可执行程序的方法,但我们往往需要调用一些批处理命令。而Java却不提供。这里,我采用一种变相的调用方法,使得Java能调用批处理命令。
  
  前期准备
  
  Quick Batch File (De)Compiler
  
  将任何BAT、CMD批处理脚本编译为EXE文件。
  
  1、运行exe 文件
  
  Java JDK里已经提供了调用的方法,不在累赘,代码如下。
  
  
  try {
  String command = “notepad”;
  Process child =
  Runtime.getRuntime().exec(command);
  } catch (IOException e)
  {
  
  }
  
  2、运行 bat(批处理) 文件
  
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, 问题成功解决.

代码:

/**/ /*
* @(#)TestRun.java 1.00 2005-7-21
*
* Copyright 2006 beansoft@126.com. All rights reserved.
* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

/** */ /**
* TestRun, 测试执行批处理文件.
* @author BeanSoft
* @version 1.00 2005-7-21
*/
public class TestRun {

public static void main(String[] args) {
try {
Runtime.getRuntime().exec( ” cmd /c start /D\ ” D:\\Tomcat5. 0 \\bin\\\ ” startup.bat ” );
} catch (Exception e) {
e.printStackTrace();
}
}
}



【版权说明】:本网页上有部分内容来源于网上收集,但不能保证资料的完整性和准确性,仅提供参考和学习。如有侵权请立即通知我们,我们将立即删除,谢谢合作!

Add A Comment