2009-09-14 25 views
8

Quiero ejecutar un archivo por lotes desde un programa java.¿Cómo ejecutar un archivo por lotes desde Java?

Estoy usando el siguiente comando.

Runtime.getRuntime().exec("server.bat"); 

Pero el problema es que quiero dar un camino reative en lugar de ruta absoluta para que pueda implementar ese proyecto java en cualquier comp.

La estructura de directorio del proyecto es como la siguiente manera:

com 
    | 
    project 
    | 
    ------ parser 
    |   |_____ Main.java 
    | 
    -------util 
      |_____ Server.bat 

que desea ejecutar el archivo "server.bat" en el directorio "util" del archivo "Main.java" en el " analizador "dir.

Respuesta

5

Cuando se está ejecutando Java y utiliza Runtime.exec() con una ruta relativa, relativa significa relativa al direcory del usuario actual, donde se invocó la JVM.

Esto puede funcionar

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat"); 

si comienza a Java desde el directorio principal de com.

O se debe calcular una ruta de Absolut:

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat"); 

me olvido, leer When Runtime.exec() won't.

+0

no existe un método "Exec" en la clase de tiempo de ejecución que utiliza tres parámetros de cadena. –

+0

Eso es verdad. Me refiero a la versión String [] pero no puedo ingresar parenthsis cuadrados en el cuadro de texto SO ... creo que debo leer SO manuals/wiki ... – PeterMmm

+0

digamos que tengo tres comandos que se supone deben ejecutarse desde CMD, se abrirán tres ventanas CMD separadas para cada uno de los comandos, ¿hay alguna manera de ejecutar los tres comandos en una ventana de CMD? – viveksinghggits

6

usted tiene que funcionar "cmd.exe" con los argumentos "/ c" y "server.bat":

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" }); 
8

Puede utilizar ProcessBuilder para esto. Proporciona mucho más control que exec. Particularmente, permite establecer el directorio de trabajo con el método directory.

Ejemplo:

ProcessBuilder pb = new ProcessBuilder("server.bat"); 
pb.directory(new File(deployDir + "\\com\\project\\util")); 
Process p = pb.start(); 
int exitStatus = p.waitFor(); 

Por supuesto, su aplicación debe obtener deploydir de alguna parte. Se puede configurar en el entorno, en el archivo de configuración de la aplicación, puede ser el directorio de usuario actual o cualquier otra cosa.

+0

no funciona para mí no sé por qué –

0

Plexus utils proporciona un tipo de línea de comandos que puede invocar una línea de comandos arbitraria y manejar el análisis sintáctico de la salida.

Commandline cl = new Commandline(); 

cl.setExecutable("cmd.exe"); 
cl.createArg().setValue("/c"); 

cl.setWorkingDirectory(new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat")); 

cl.createArg().setValue("/c"); 

StreamConsumer consumer = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

StreamConsumer stderr = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

int exitCode; 

try { 
    exitCode = CommandLineUtils.execute(cl, consumer, stderr, getLogger()); 
} catch (CommandLineException ex) { 
    //handle exception 
} 
0

Usted está mejor apuesta es almacenar el directorio de instalación de la aplicación en el sistema y luego utilizar eso para construir sus caminos dentro de la aplicación. System.getProperty ("user.dir") debería funcionar en las plataformas de Windows y Unix para obtener el directorio de trabajo actual, pero depende del sistema, así que tenlo en cuenta.

0

El segundo parámetro para exec es un String [] de args para la configuración del entorno (null significa heredar los procesos actuales) y el tercer parámetro para exec debe ser un archivo que proporcione el directorio de trabajo. Pruebe esto:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util")); 
4

Puede probarlo con Desktop si es compatible (Java 1.6)

File file = new File("server.bat"); 
    Desktop.getDesktop().open(file); 
+0

Realmente nuevo para mí. – Arshed

Cuestiones relacionadas