首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从java代码运行批处理文件代码。

从java代码运行批处理文件代码。
EN

Stack Overflow用户
提问于 2018-08-08 10:04:40
回答 2查看 148关注 0票数 1

我想执行一个批处理文件代码从java按钮点击。另外,我不希望任何命令提示符窗口都显示在java代码中。

我有个密码:-

代码语言:javascript
复制
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文件路径。

我是通过java代码在按钮上单击transform完成这一操作的:-

代码语言:javascript
复制
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错误。

我被困在这里很长时间了,我哪里出错了。

编辑:-错误

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-08 11:00:44

试试这个:

代码语言:javascript
复制
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. 如果您希望进程的输出显示为您的inheritIO()应用程序输出的一部分,请考虑使用redirectErrorStream()而不是redirectErrorStream()
票数 2
EN

Stack Overflow用户

发布于 2018-08-08 10:20:32

正如Error所提到的,它无法定位命令,因为整个字符串将被ProcessBuilder视为命令

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

代码语言:javascript
复制
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;

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

主要的改进是,对于影响流程的所有属性,它还充当持有者。这就是它的使用方式:

代码语言:javascript
复制
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

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

代码语言:javascript
复制
Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});

我个人的喜好:

  1. 如果您必须为命令配置环境:要控制working directoryenvironment variables,并且还要多次执行命令,最好使用它,因为ProcessBuilder将保存设置,您只需要使用processBuilder.start()创建具有相同设置的另一个进程;
  2. 如果您想像前面提到的那样执行一个完整的长字符串命令,那么最好使用Runtime.getRuntime().exec,因为您可以直接在那里执行它,而不会对参数格式产生任何影响。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51743942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档