![](/img/trans.png)
[英]ProcessBuilder won't properly run with unified arguments with spaces in a path
[英]ProcessBuilder cannot run bat file with spaces in path
我有以下代码段来运行bat文件:
String workingDir = System.getProperty("user.dir");
ProcessBuilder pb = new ProcessBuilder("cmd", "/c",
"\"" + workingDir + File.separator + "midl.bat\"");
Process ddsBuildProc = pb.start();
ddsBuildProc.waitFor();
workingDir包含路径中的空格。 虽然我使用引号括起workingDir + fileName字符串,但shell仍会拆分workingDir并且不运行bat文件。 如果手动尝试并复制粘贴 - 在Windows命令窗口中执行bat文件路径字符串,它将按预期工作。 这可能是什么问题?
此外,请不要将此问题视为重复,因为我在其他问题中尝试了所有解决方案但没有成功。
user.dir
是你的程序当前正在执行的上下文......所以包含它实际上是没有意义的,你可以midl.bat
使用midl.bat
(假设命令存在于当前执行上下文中) 我写了一个非常简单的批处理文件......
@echo off
dir
我把它放在我的“C:\\ Program Files”目录中,因为我需要一个带空格的路径并使用....
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class RunBatch {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder(
"cmd", "/c", "listme.bat"
);
pb.directory(new File("C:/Program Files"));
pb.redirectError();
try {
Process process = pb.start();
InputStreamConsumer.consume(process.getInputStream());
System.out.println("Exited with " + process.waitFor());
} catch (IOException | InterruptedException ex) {
ex.printStackTrace();
}
}
public static class InputStreamConsumer implements Runnable {
private InputStream is;
public InputStreamConsumer(InputStream is) {
this.is = is;
}
public static void consume(InputStream inputStream) {
new Thread(new InputStreamConsumer(inputStream)).start();
}
@Override
public void run() {
int in = -1;
try {
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}
运行它没有任何问题......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.