Ejecutar comando de CMD con java. Ayuda Porfa

Iniciado por MC.cover, 10 Enero 2016, 05:49 AM

0 Miembros y 1 Visitante están viendo este tema.

MC.cover

Hola tengo un problema últimamente me puse a profundizar un poco en el lenguaje JAVA y se me ocurrió probar ejecutar un comando o varios de CDM desde java. Por lo cual me puse a leer un poco, mi problema es que logro ejecutar el comando wmic pero no puedo ejecutar el otro comando cabe decir que lo que quiero hacer es poder eliminar un programa desde linea de comandos pero que java lleve acabo lo que son las ordenes a CMD.
Espero que me puedan ayudar. Gracias de antemano.
Les dejo el código abajo.

Código (java) [Seleccionar]


package CMD;
import java.io.*;
public class ccmd {

public static void main(String[] args) throws IOException {
Runtime cmd=Runtime.getRuntime();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.println("programa a desinstalar");

String programa=br.readLine();

try {

Process process=cmd.exec("wmic");
System.out.println("accedido a WMIC");

process=cmd.exec("product where name='"+programa+"' call uninstall");
System.out.println("peticion de desintalacion hecha");

Thread.sleep(9000);
process=cmd.exec("y");

System.out.println(programa+" desinstalado");
} catch (Exception e) {
System.out.println("error"+e.getMessage());
}

}

}


0xFer

#1
Código (java) [Seleccionar]
Process process=cmd.exec("wmic");

Aqui enlazas el programa wmic con java pero después cuando llamas al método exec() pierdes el enlace que ya habias establecido. Eso lo haces en la siguiente linea;

Código (java) [Seleccionar]
process=cmd.exec("product where name='"+programa+"' call uninstall");

Para darle una orden al wmic debes tomar el OutputStream de process, eso lo puedes hacer asi;

Código (java) [Seleccionar]
Process process=cmd.exec("wmic");
OutputStream stdin = process.getOutputStream ();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));


Luego ya puedes escribir cualquier comando para wmic

Código (java) [Seleccionar]
writer.write("product where name='"+programa+"' call uninstall");
writer.flush();
writer.close();


Si no te funciona entonces ejecutas el exec sólo una vez con todo el argumento para el programa;

Código (java) [Seleccionar]
Process process=cmd.exec("wmic /C product where name='"+programa+"' call uninstall");

el /C indica que se va a ejecutar el argumento y el programa wmic terminará.


Un saludo.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

MC.cover

Muchísimas gracias por responderme a la duda. Pero el problema persiste un poco. Que quiero decir ahora por lo menos no parece como si estuviera cortando la comunicación ni nada por el estilo el programa termina de correr y cuando voy a corroborar si lo hizo no lo hizo.Hago la prueba con Adobe AIR ver si funciona para saltar el paso de ingresar el nombre del programa.(Pereza simplemente xD).

Código (java) [Seleccionar]


package CMD;
import java.io.*;
public class ccmd {

public static void main(String[] args){
Runtime cmd=Runtime.getRuntime();

try {

Process process=cmd.exec("wmic");
OutputStream stdin=process.getOutputStream();
BufferedWriter write= new BufferedWriter(new OutputStreamWriter(stdin));

write.write("product where name='Adobe AIR' call uninstall");
Thread.sleep(7000);/*pongo un lapso de tiempo de 7 segundos
*porque entre que hago la peticion
*y me manda el mensaje de desinstalacion del programa para confirmar
*pasan unos 5 segundos aproximadamente*/
write.write("y");//lugo mando la letra Y para confirmar la desinstalacion

write.flush();
write.close();

System.out.println("eliminacion exitosa");

//el programa llega hasta este punto sin ningun problema ni aviso de error
//pero cuando voy a corroborar si lo desinstalo no paso nada

} catch (Exception e) {
System.out.println("error"+e.getMessage());
}

}

}



Nuevamente muchas gracias por explicarme un poco y espero que me puedas explicar un porque de esto. Desde ya Muchas gracias.

0xFer

Hola, encontré otra solución al problema y me parece mejor;

Código (java) [Seleccionar]
Process process = cmd.exec("wmic product where name='Nombre Programa' call uninstall /nointeractive");

Pero, de todos modos, vas a tener que ejecutar el programa en modo administrador para tener los privilegios de desinstalación. Una manera en la que lo puedes hacer es primero crear el archivo jar del programa(depende del IDE con el que estes trabajando, en internet hay mucha información, esto es trivial) y luego abrir una cmd en modo administrador, para eso te vas a la carpeta Windows > System32 > cmd.exe click derecho y "ejecutar como administrador" y luego con el comando "cd" te posicionas en la carpeta del jar y lo ejecutas con la cmd.

En Windows sé que hay otras formas de hacerlo( no sé cómo pero se puede), pero eso ya lo irás descubriendo  ;)

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

MC.cover

Muchisimas gracias por ayudarme 0xFer funciono de lo mas bien Gracias nuevamente :)

0xFer

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}