2012-03-23 11 views
8

Un'altra domanda in rapida successione, ma questo deve essere un errore molto evidente che non vedo. Ho scritto del codice per eseguire un file batch di seguito, ma ricevo un messaggio di errore che dice che non è possibile trovare il file, ma posso assicurarti che il file esiste nella directory!ProcessBuilder non trova il file ?!

public class Pull { 

public void pullData() throws IOException { 
    ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
} 

public static void main(String[] args) throws IOException { 
    Pull pull = new Pull(); 
    pull.pullData(); 
} 

}

e qui è il messaggio di errore

Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified 
+0

Quindi, adb.bat è in c: \, giusto? prova a metterlo o una copia nella cartella del progetto – keyser

+0

non funziona neanche lì. Sto usando il processbuilder correttamente? – Rookie

+0

Hai provato a eseguire il contenuto del file batch come argomento del tuo 'ProcessBuilder'? Ad esempio, se "adb.bat" fa qualcosa come "java -version", hai provato a fare qualcosa come 'new ProcessBuilder (" java "," - server ")'? Mi chiedo se Java stia cercando di trattare adb.bat come un eseguibile, anche se in realtà è solo uno script basato su testo. – CodeBlind

risposta

11

Sto lavorando con Linux, ma lo stesso errore si verifica quando si esegue il codice (modificato per eseguire un sh piuttosto che .bat).

Prova:

ProcessBuilder pb = new ProcessBuilder("c:\\adb.bat"); 

A quanto pare utilizzando ProcessBuilder.directory non influisce la directory di lavoro (ai fini della scoperta l'eseguibile) che è stato scelto, quando il costruttore è stato costruito (almeno, questo è quello che sembra accadere. la documentazione dicono che cambierà la directory di lavoro, quindi credo che i file di input/output potrebbe essere relativo a questo?)

non sono sicuro di quello che sta realmente facendo internamente, ma che fornisce il percorso del file eseguibile nel costruttore ha risolto il problema.

Questo post talks about the problem and this solution, ma solleva anche se le variabili di ambiente devono essere impostate, di cui le variabili "path" potrebbero essere utili per aiutare lo ProcessBuilder a scoprire un file eseguibile.

2

Ciao prova a usare il tutorial qui - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/. Usandolo ho cambiato un po 'la tua classe e trova il file (nota che non so cosa c'è dentro quindi non posso testarlo completamente). Compilare e funziona senza problemi, mentre io stesso ho riscontrato gli stessi problemi:

public class Pull { 


public void pullData() throws IOException { 
    /*ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
    */ 
    ProcessBuilder p = new ProcessBuilder("C:\\adb.bat"); 
    p.start(); 
    System.out.println(p.toString()); 
} 


public static void main(String[] args) throws IOException { 


    Pull pull = new Pull(); 
    pull.pullData(); 

} 


}