从java代码运行批处理文件代码
我想从java按钮单击执行批处理文件代码。另外,我不希望任何命令提示符窗口都显示在java代码中 我有一个代码:-从java代码运行批处理文件代码,java,batch-file,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>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)
正如前面提到的
错误
所述,它无法定位命令,因为整个字符串将被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");
另外,实际上Runtime.getRuntime().exec也可以与String…
一起使用,如下所示:
Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});
我个人偏好:
如果您必须为命令配置环境:要控制工作目录
或环境变量
,并且还要多次执行命令,最好使用它,因为ProcessBuilder
将保存设置,您只需执行ProcessBuilder.start()
创建另一个具有相同设置的流程
如果您想执行前面提到的整个长字符串命令,最好使用Runtime.getRuntime().exec
,因为您可以直接执行它,而不必考虑参数格式
正如前面提到的错误
所述,它无法定位命令,因为整个字符串将被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");
另外,实际上Runtime.getRuntime().exec也可以与String…
一起使用,如下所示:
Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});
我个人偏好:
如果您必须为命令配置环境:要控制工作目录
或环境变量
,并且还要多次执行命令,最好使用它,因为ProcessBuilder
将保存设置,您只需执行ProcessBuilder.start()
创建另一个具有相同设置的流程
如果您想执行前面提到的整个长字符串命令,最好使用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();
这表明了以下几点:
命令与参数分开
参数值可以在运行时确定
命令的默认目录(C:\xyz-3.1.1\bin
)在启动进程之前设置
如果希望进程的输出显示为Java应用程序输出的一部分,请考虑使用inheritaio()
而不是redirectErrorStream()
试试这个:
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
)在启动进程之前设置
如果希望进程的输出显示为Java应用程序输出的一部分,请考虑使用inheritaio()
而不是redirectErrorStream()
请发布异常的完整堆栈跟踪。“getting IOException error”-让我们知道您收到的错误(例如message、stacktrace等)会很有帮助@Azem我在中添加了异常EDIT@Thomas我在编辑中添加了,请仔细查看异常的完整堆栈跟踪。“getting IOException error”-让我们知道您收到的错误(例如消息、stacktrace等)会很有帮助@Azem我在中添加了异常EDIT@Thomas我在编辑中添加了,请看一看是的,这是正确的,我在命令上犯了一些错误。这就是我的问题,我如何编写命令,这样我就可以用java执行它,而不是分批单独执行。你的第一点是有意义的。由于我对批处理脚本不太了解,在我的例子中我将如何实现这一点。在您的命令中,dita
到底是什么?脚本文件名?如果是,您可以直接使用exec
直接执行它。如果没有,那么错误是什么?我必须在这个目录C:\xyz-3.1.1\bin>
中才能执行命令。是的,这是正确的,我在命令上犯了一些错误。我的问题是如何编写命令,以便在