2011-02-27 115 views
1

我尝试在java中运行批处理文件,但是文件不完全运行。代码看起来像: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下载文件夹,脚本将转到下一行。所有文件夹(档案,文件等)已经存在,并且下载文件夹不包含* .zip,* .tar,* .docx,* pdf文件,但是这些行通过没有问题。为什么它准确地停在ogg-line?

+0

你是否在'exec(...)'返回的进程上调用'waitFor()'? – Kru 2011-02-27 11:35:34

+0

如果我使用它,过程没有完成( – strizhechenko 2011-02-27 16:42:04

回答

0

我下注path在您的Java程序中包含空格或类似内容。你是否正确引用了?

BTW:的Runtime.exec()已superseeded用的ProcessBuilder可以处理的参数比的Runtime.exec()

更好试试这个:

 
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call \"" + path "\""); 
builder.start(); 
+0

空格没有问题,因为批处理开始运行,并且将* .odt和* .doc移动到文档,问题从第二个“if”语句开始。 – strizhechenko 2011-02-27 12:35:35

+0

此外您的变种 – strizhechenko 2011-02-27 14:02:49

+0

我错过了'call'命令,修正了它 – 2011-02-27 14:06:17

1

我认为问题是,有批处理脚本中的一个错误。该MSDN documentationif指示状态如下:

不能使用,如果命令直接测试目录,但空(NUL)设备并在每一个目录中。因此,您可以测试空设备以确定目录是否存在。一个目录是否存在下面的示例测试:

if exist c:\mydir\nul goto process

现在你正在使用它的方式(if not exist directory mkdir directory)是有可能成功,如果目录不存在...但尝试创建该目录第二次,如果它确实存在。噢...


现在,Java应用程序读取并打印出的过程中错误流的内容,你很可能会看到一个错误信息,告诉您Archives目录已经存在。国际海事组织忽略输出是要求麻烦。

+0

如果存在c:\ mydir \ nul返回false(输出:http://pastebin.com/8Bm2c2FH – strizhechenko 2011-02-27 14:16:48

+0

@panzersoldat - 所以你改变了你编码读取和打印输出的过程呢? – 2011-02-27 14:27:52

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); 
} 

工作正常! %)

如果有人明白这一点,请解释一下。

+0

看起来好像当你的Java程序完成并被杀死后,你的过程还没有完成,或者过程想要输出某些东西而不能输出(因为你没有做过, t读它),因此在读等待成功。 – 2011-02-27 16:05:50

+0

欢迎来到SO,不要发布一个新的答案给你自己的问题,请编辑你的问题,而不是。 – 2011-02-28 09:51:26

0

如果你不小心你的stdout和stderr流很容易死锁ProcessBuilder或Runtime.exec()。文章When Runtime.exec() won't在JavaWorld上包含了很多关于这个和其他一些陷阱的有用信息。

如果可能的话,我会建议使用Commons Exec,因为所有需要的流体泵送都是为您完成的。