我想通过单击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)
答案 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});
我的个人偏好:
如果必须配置命令的环境:控制working directory
或environment variables
,并且还想多次执行命令,则最好使用它,因为ProcessBuilder
将保留设置,您只需要做processBuilder.start()
即可创建具有相同设置的另一个进程;
如果您要执行所提到的整个长字符串命令,最好使用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();
这显示了以下几点:
C:\xyz-3.1.1\bin
)inheritIO()
而不是redirectErrorStream()
。