Java&多行批处理文件

时间:2011-02-27 11:29:56

标签: java batch-file if-statement multiline runtime.exec

我尝试在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?

4 个答案:

答案 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,因为所有必需的流抽取都是为您完成的。