java - desde - ejecutar un class
¿Cómo ejecuto un archivo por lotes desde mi aplicación Java? (11)
En mi aplicación Java, quiero ejecutar un archivo por lotes que llame a " scons -Q implicit-deps-changed build/file_load_type export/file_load_type
"
Parece que ni siquiera puedo ejecutar mi archivo por lotes. Estoy sin ideas.
Esto es lo que tengo en Java:
Runtime.
getRuntime().
exec("build.bat", null, new File("."));
Anteriormente, tenía un archivo Python Sconscript que quería ejecutar, pero como eso no funcionaba, decidí llamar al script a través de un archivo por lotes, pero ese método no ha tenido éxito hasta el momento.
A veces, el tiempo del proceso de ejecución de subprocesos es mayor que el tiempo de proceso de espera de subprocesos de JVM, suele suceder cuando el proceso que invoca tarda un poco en procesarse, use el comando waitFor () de la siguiente manera:
try{
Process p = Runtime.getRuntime().exec("file location here, don''t forget using / instead of // to make it interoperable");
p.waitFor();
}catch( IOException ex ){
//Validate the case the file can''t be accesed (not enought permissions)
}catch( InterruptedException ex ){
//Validate the case the process is being stopped by some external situation
}
De esta forma, la JVM se detendrá hasta que el proceso que invoca se realice antes de continuar con la pila de ejecución de subprocesos.
El archivo ejecutable utilizado para ejecutar scripts por lotes es cmd.exe
que utiliza el cmd.exe
/c
para especificar el nombre del archivo de proceso por lotes que se ejecutará:
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"});
Teóricamente, también debería poder ejecutar Scons de esta manera, aunque no he probado esto:
Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build/file_load_type", "export/file_load_type"});
EDITAR: Amara, dices que esto no está funcionando. El error que enumeró es el error que obtendría al ejecutar Java desde un terminal Cygwin en un cuadro de Windows; es esto lo que estás haciendo? El problema con eso es que Windows y Cygwin tienen diferentes rutas, por lo que la versión de Windows de Java no encontrará el ejecutable scons en su ruta Cygwin. Puedo explicar más si este es tu problema.
Este código ejecutará dos comandos.bat que existen en la ruta C: carpeta / carpetas.
Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");
Lo siguiente está funcionando bien:
String path="cmd /c start d://sample//sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);
Los archivos por lotes no son ejecutables. Necesitan una aplicación para ejecutarlos (es decir, cmd).
En UNIX, el archivo de script tiene shebang (#!) Al comienzo de un archivo para especificar el programa que lo ejecuta. El Explorador de Windows realiza un doble clic en Windows. CreateProcess
no sabe nada al respecto.
Runtime.
getRuntime().
exec("cmd /c start /"/" build.bat");
Nota: con el comando start /"/"
, se abrirá una ventana de comando separada con un título en blanco y se mostrará allí cualquier resultado del archivo por lotes. También debería funcionar con `cmd / c build.bat '', en cuyo caso la salida se puede leer desde el subproceso en Java, si se desea.
Para ejecutar archivos por lotes usando Java si de eso se trata ...
String path="cmd /c start d://sample//sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`
Esto debería hacerlo.
Para expandir el índice de @ Isha, puede hacer lo siguiente para obtener el resultado devuelto (post-facto, no en tiempo real) del script que se ejecutó:
try {
Process process = Runtime.getRuntime().exec("cmd /c start D://temp//a.bat");
System.out.println(process.getText());
} catch(IOException e) {
e.printStackTrace();
}
Tuve el mismo problema. Sin embargo, a veces CMD no pudo ejecutar mis archivos. Es por eso que creo un temp.bat en mi escritorio, luego este temp.bat va a ejecutar mi archivo, y luego se eliminará el archivo temporal.
Sé que este es un código más grande, pero funcionó para mí en un 100% cuando incluso Runtime.getRuntime () .exec () falló.
// creating a string for the Userprofile (either C:/Admin or whatever)
String userprofile = System.getenv("USERPROFILE");
BufferedWriter writer = null;
try {
//create a temporary file
File logFile = new File(userprofile+"//Desktop//temp.bat");
writer = new BufferedWriter(new FileWriter(logFile));
// Here comes the lines for the batch file!
// First line is @echo off
// Next line is the directory of our file
// Then we open our file in that directory and exit the cmd
// To seperate each line, please use /r/n
writer.write("cd %ProgramFiles(x86)%//SOME_FOLDER /r/nstart xyz.bat /r/nexit");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Close the writer regardless of what happens...
writer.close();
} catch (Exception e) {
}
}
// running our temp.bat file
Runtime rt = Runtime.getRuntime();
try {
Process pr = rt.exec("cmd /c start /"/" /""+userprofile+"//Desktop//temp.bat" );
pr.getOutputStream().close();
} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
// deleting our temp file
File databl = new File(userprofile+"//Desktop//temp.bat");
databl.delete();
ProcessBuilder es la forma de Java 5/6 para ejecutar procesos externos.
Process p = Runtime.getRuntime().exec(
new String[]{"cmd", "/C", "orgreg.bat"},
null,
new File("D://TEST//home//libs//"));
probado con jdk1.5 y jdk1.6
Esto estaba funcionando bien para mí, espero que ayude a otros también. para conseguir esto, he luchado más días. :(
Runtime runtime = Runtime.getRuntime();
try {
Process p1 = runtime.exec("cmd /c start D://temp//a.bat");
InputStream is = p1.getInputStream();
int i = 0;
while( (i = is.read() ) != -1) {
System.out.print((char)i);
}
} catch(IOException ioException) {
System.out.println(ioException.getMessage() );
}