2017-07-28 88 views
0

我正在写一个java程序,它在某个时候执行一个cmd文件。 两者都在相同的目录中。java执行cmd文件失败

我使用ProcessBuilder,因为它更灵活。 然而,当我运行此代码失败:

String current_directory = System.getProperty("user.dir"); 

ProcessBuilder builder=new ProcessBuilder(current_directory+"\\"+ "myCmdFile.cmd"); 
builder.directory(new File(current_directory)); 
File log = new File("log.txt"); 
builder.redirectErrorStream(true); 
builder.redirectOutput(Redirect.appendTo(log)); 
Process process=builder.start(); 
process.waitFor(); 
System.out.println("CMD file executed"); 

我得到这个异常:

java.io.IOException: Cannot run program "C:\test\myCmdFile.cmd" (in directory "C:\test"): No such file or directory 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at org.java.test.executeCmdFile(MyMainClass.java:189) 
    at org.java.test.main(MyMainClass.java:70) 
Caused by: java.io.IOException: No such file or directory 
    at java.lang.ProcessImpl.openForAtomicAppend(Native Method) 
    at java.lang.ProcessImpl.newFileOutputStream(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
    ... 3 more 

然而,当我注释掉这些行比它的工作原理:

ProcessBuilder builder=new ProcessBuilder(current_directory+"\\"+ 
    "myCmdFile.cmd"); 
    //builder.directory(new File(current_directory)); 
    //File log = new File("log.txt"); 
    // builder.redirectErrorStream(true); 
    // builder.redirectOutput(Redirect.appendTo(log)); 
    Process process=builder.start(); 
    process.waitFor(); 
    System.out.println("CMD file executed"); 

我需要这些行,因为我想有日志消息。

+0

current_directory是否包含绝对路径? –

+0

@亚历山大是啊,斯里,忘了那条线(我编辑了我的问题)。 – Norbert94

+0

对不起,看起来我需要一杯咖啡。 – GhostCat

回答

0

我发现我的错误......这是一个愚蠢的one..This代码实际工作:

String current_directory = System.getProperty("user.dir"); 

ProcessBuilder builder=new ProcessBuilder(current_directory+"\\"+ "myCmdFile.cmd"); 
builder.directory(new File(current_directory)); 
File log = new File("log.txt"); 
builder.redirectErrorStream(true); 
builder.redirectOutput(Redirect.appendTo(log)); 
Process process=builder.start(); 
process.waitFor(); 
System.out.println("CMD file executed"); 

问题是这一行:

File log = new File("log.txt"); 

在我的生产环境,这是一个很长的路径(这是错误的),但是为了演示的目的,我改变了它,在我发布这个问题之前。我认为这个问题与cmd文件有关,例外告诉我整个时间...现在我给出了一个正确的日志文件路径它工作..thx大家