1

我尝试在 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,又停在这里了。和 Java 代码:链接。如果将 somename.ogg 添加到下载文件夹,则脚本转到下一行。所有文件夹(存档、文档等)都已存在,并且下载文件夹不包含 *.zip、*.tar、*.docx、*pdf 文件,但这些行顺利通过。为什么它正好停在 ogg 线?

4

4 回答 4

1

我认为问题在于您的批处理脚本中存在错误。该命令的MSDN 文档说明了if这一点:

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

if exist c:\mydir\nul goto process

现在,如果目录不存在,您使用它的方式 ( if not exist directory mkdir directory) 可能会成功......但如果目录确实存在,则尝试再次创建目录。哎呀...


现在,您的 Java 应用程序读取并打印出该进程的错误流的内容,您很可能会看到一条错误消息,告诉您该Archives目录已经存在。忽略输出是自找麻烦,IMO。

于 2011-02-27T13:18:14.243 回答
0

如果您对 stdout 和 stderr 流不小心,容易使 ProcessBuilder 或 Runtime.exec() 死锁。JavaWorld 上的文章When Runtime.exec() won't包含很多关于此问题和其他一些陷阱的有用信息。

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

于 2011-02-27T17:09:26.980 回答
0

天哪,伙计们!

我不明白为什么,但是:

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

工作正常!%)

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

于 2011-02-27T14:42:16.420 回答
0

我敢打赌path你的 Java 程序中包含空格或类似的东西。你引用正确吗?

顺便说一句:Runtime.exec() 已被 ProcessBuilder 取代,它可以比 Runtime.exec() 更好地处理参数

尝试这个:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call \"" + path "\"");
builder.start();
于 2011-02-27T11:36:09.880 回答