从Java代码运行批处理文件代码

时间:2018-08-08 10:04:41

标签: java batch-file

我想通过单击Java按钮执行批处理文件代码。另外,我也不希望从Java代码中全部显示任何命令提示符窗口。

我有一个代码:-

C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/m
obilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Use
rs/india/Desktop/dofhdif.txt

因此,我希望上述代码从以 C:\ xyz-3.1.1 \ bin> 作为父目录的批处理命令运行。

每当我从JFileChooser中选择新文件时,我也想更新-input 文件路径。

我是通过按钮点击转换上的Java代码完成此操作的:-

ProcessBuilder pb=new ProcessBuilder("dita --input=C:/Users/india/Desktop/mobile-phone/mobilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Users/india/Desktop/dofhdif.txt");
pb.redirectErrorStream(true);
Process process=pb.start();

并收到IOException错误。

我在这里呆了很长时间,哪里出问题了。

编辑:-错误

java.io.IOException: Cannot run program "dita --input=C:/Users/india/Desktop/mobile-phone/m
obilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Use
rs/india/Desktop/dofhdif.txt": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)

2 个答案:

答案 0 :(得分:2)

Error所述,它无法找到命令,因为整个字符串将被ProcessBuilder视为命令

尝试直接使用Runtime.getRuntime().exec,但是必须确保可以找到命令dita

Process process = Runtime.getRuntime().exec("C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/mobilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Users/india/Desktop/dofhdif.txt");
process.waitFor();
int exitCode = process.exitValue();
System.out.println(IoHelper.output(process.getInputStream())); // handle the output;

在JDK 5.0之前,启动进程并执行它的唯一方法是使用java.lang.Runtime类的exec()方法,之后可使用ProcessBuilder来帮助创建操作系统进程。

主要的改进是,它还对影响流程的所有那些属性起到了持有人的作用。这就是应该使用的方式:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

P.S。实际上,Runtime.getRuntime().exec也可以与String...一起使用,如下:

Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});

我的个人偏好:

  1. 如果必须配置命令的环境:控制working directoryenvironment variables,并且还想多次执行命令,则最好使用它,因为ProcessBuilder将保留设置,您只需要做processBuilder.start()即可创建具有相同设置的另一个进程;

  2. 如果您要执行所提到的整个长字符串命令,最好使用Runtime.getRuntime().exec,因为您可以在那里直接执行它而无需理会参数格式。

答案 1 :(得分:1)

尝试一下:

String inputFile = ...;
String outputFile = ...;
String logFile = ...;

ProcessBuilder pb = new ProcessBuilder(
        "dita",
        "--input=" + inputFile,
        "--format=pdf",
        "--output=" + outputFile,
        "--logfile=" + logFile)
    .directory(new File("C:\\xyz-3.1.1\\bin"))
    //.inheritIO();
    .redirectErrorStream(true);

Process process = pb.start();

这显示了以下几点:

  1. 命令与参数分开
  2. 参数值可以在运行时确定
  3. 在开始执行之前,已设置命令的默认目录(C:\xyz-3.1.1\bin
  4. 如果您希望进程的输出作为Java应用程序输出的一部分出现,请考虑使用inheritIO()而不是redirectErrorStream()