我编写了一个批处理文件,该文件读入包含文件名列表的文本文件,然后逐个删除并重命名。我是通过使用for循环完成的,双击它就可以完美地工作。
但是当我试图从Java程序调用这个批处理时。它不再适用于这一部分:
for /f %%a in (ListFile.txt) do ( DEL %%a REN %%a_NEW %%~nxa )
如果我只指定某个文件名。它通过从Java调用来工作。说,
DEL tag.jar REN tag.jar_NEW tag.jar
'call'命令也会发生同样的事情。如果从Java程序调用它不起作用,这使得我必须使用'start'命令。
有人可以告诉我为什么会这样吗?如果从Java程序调用它怎么能使它也工作?
答案 0 :(得分:1)
你是如何用Java调用它的?
当你这么做时到底发生了什么?
当你从Java调用它时,为什么要调用批处理文件而不是用Java做同样的事情呢?
答案 1 :(得分:1)
您应该使用:
Runtime.getRuntime().exec("cmd /c update.bat");
相反。
Here是关于如何从java运行程序的片段。
以下是我测试的方式。
import java.io.*;
public class RunIt {
public static void main( String [] args ) throws Throwable {
Process p = Runtime.getRuntime().exec( "cmd /c update.bat");
InputStream i = p.getInputStream();
for( int c = 0 ; ( c = i.read() ) > -1 ; ) {}
i.close();
}
}
由于某些原因超出了我的理解范围,如果我没有读取输入,则不会执行该过程,这就是上面 for 循环的原因。
这是我的测试:
C:\oreyes\samples\java\readinput>type update.bat
echo "x" >> x.txt
C:\oreyes\samples\java\readinput>dir x.txt
Directorio de C:\oreyes\samples\java\readinput
No se encuentra el archivo // That is file not found
C:\oreyes\samples\java\readinput>javac RunIt.java
C:\oreyes\samples\java\readinput>java RunIt
C:\oreyes\samples\java\readinput>dir x.txt
01/16/2009 11:14 AM 6 x.txt // file created hence update.bat executed
1 archivos 6 bytes
我希望这会有所帮助。
答案 2 :(得分:0)
也许当前目录不是您所想的,因此找不到ListFile.txt。
尝试类似:
set BAT_HOME=%~dp0
echo %BAT_HOME%
for /f %%a in (%BAT_HOME%\ListFile.txt) do (
DEL %%a
REN %%a_NEW %%~nxa
)
答案 3 :(得分:0)
进程p = Runtime.getRuntime()。exec(“update.bat”);
p.waitFor();
答案 4 :(得分:0)
你确定你被允许执行BAT脚本吗?我不认为Windows将它们视为与Unix一样的第一类可执行文件。你可能不得不做一些奇怪的事情:
...exec("cmd /c update.bat")