2012-03-23 24 views
8

Otra pregunta en rápida sucesión pero esto tiene que ser un error muy obvio que no estoy viendo. He escrito un código para ejecutar un archivo por lotes a continuación, pero aparece un mensaje de error que dice que no puede encontrar el archivo, pero puedo asegurarle que el archivo existe en el directorio.ProcessBuilder no puede encontrar el archivo ?!

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

}

y aquí está el mensaje de error

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

Entonces, adb.bat está en c: \, ¿verdad? intente colocarlo o una copia de él en la carpeta del proyecto – keyser

+0

tampoco funciona allí. ¿Estoy usando Processbuilder correctamente? – Rookie

+0

¿Ha intentado ejecutar los contenidos del archivo de proceso por lotes como argumentos para su 'ProcessBuilder'? Por ejemplo, si "adb.bat" hace algo como "java -version", ¿ha intentado hacer algo como 'new ProcessBuilder (" java "," - server ")'? Me pregunto si Java está tratando de tratar adb.bat como un ejecutable, a pesar de que en realidad es solo un script basado en texto. – CodeBlind

Respuesta

11

estoy corriendo Linux, pero el mismo error ocurre cuando corro el código (modificado para ejecutar un .sh en lugar de .murciélago).

Probar:

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

usando parecer ProcessBuilder.directory no afecta el directorio de trabajo (para el fin de descubrir el ejecutable) que fue elegida cuando se construyó el constructor (al menos, eso es lo que parece Los documentos dicen que cambiará el directorio de trabajo, así que supongo que los archivos de entrada/salida pueden estar relacionados con eso?

No estoy seguro de lo que realmente está haciendo internamente, pero proporciona la ruta al ejecutable en el el constructor solucionó el problema.

En esta publicación talks about the problem and this solution, pero también se plantea si las variables de entorno deben establecerse, de las cuales las variables de tipo "ruta" pueden ser útiles para ayudar a ProcessBuilder a descubrir un ejecutable.

2

Hola trato de usar el tutorial aquí - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/. Utilicándolo he cambiado un poco tu clase y encuentra el archivo (ten en cuenta que no sé qué hay dentro, así que no puedo probarlo por completo). Se compila y se ejecuta sin problemas, mientras que el suyo yo experimento los mismos problemas que usted:

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

} 


} 
Cuestiones relacionadas