繁体   English   中英

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

[英]Run batch file code from java code

我想从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)

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");

PS实际上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因为您可以在那里直接执行它而无需理会参数格式。

尝试这个:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM