我尝试在java中运行批处理文件,但文件执行不完全。代码如下:
Runtime.getRuntime().exec("cmd /c call "+path);
当我尝试手动运行它时,没有java,批处理工作正常。
批处理文件包含下一个代码:
cd C:\Downloads\
if not exist Documents mkdir Documents
move *.odt Documents
move *.doc Documents
if not exist Archives mkdir Archives
move *.tar Archives
move *.gz Archives
if not exist Music mkdir Music
move *.mp3 Music
Java完成批次只到第五行。有没有人遇到过这个?
嗯,batch,它再次停止here。和Java代码:link。如果将somename.ogg添加到downloads文件夹,脚本将转到下一行。所有文件夹(存档,文档等)都已存在,并且downloads文件夹不包含* .zip,* .tar,* .docx,* pdf文件,但这些行传递没有问题。为什么它恰好停留在ogg-line?
答案 0 :(得分:1)
我认为问题在于您的批处理脚本中存在错误。 if
命令的MSDN documentation表示:
您不能使用if命令直接测试目录,但null(NUL)设备确实存在于每个目录中。因此,您可以测试空设备以确定目录是否存在。以下示例测试是否存在目录:
if exist c:\mydir\nul goto process
现在,如果目录不存在,您使用它的方式(if not exist directory mkdir directory
)可能会成功...但如果目录确实存在,则尝试再次创建目录。哎呀...
现在,您的Java应用程序读取并打印出该进程的错误流内容,您很可能会看到一条错误消息,告诉您Archives
目录已存在。忽略输出是问题,IMO。
答案 1 :(得分:0)
我敢打赌,你的Java程序中path
包含空格或类似内容。你引用得当吗?
顺便说一句:Runtime.exec()已被ProcessBuilder取代,它可以比Runtime.exec()更好地处理参数
试试这个:
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call \"" + path "\""); builder.start();
答案 2 :(得分:0)
OMG,GUYS!
我不明白为什么,但是:
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\"");
builder.start();
不起作用,但是:
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\"");
BufferedReader br = new BufferedReader(new InputStreamReader(builder.start().getInputStream()));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
正常工作! %)
如果有人理解这一点,请解释一下。
答案 3 :(得分:0)
如果您对stdout和stderr流不小心,那么非常很容易死锁ProcessBuilder或Runtime.exec()。 JavaWorld上的文章When Runtime.exec() won't
包含了很多有用的信息以及其他一些陷阱。
如果可能的话,我建议使用Commons Exec,因为所有必需的流抽取都是为您完成的。