C/Visual C - Ejecutar comandos cmd y recuperar Salida.

 
Vista:
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pepe (4 intervenciones) el 01/08/2014 15:06:17
Buenos días,

Estoy con una mini aplicación de c++, y me gustaría saber como puedo recuperar la salida de los comandos que ejecuto con system(comando);
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pico (37 intervenciones) el 01/08/2014 16:23:23
Redireccionando la salida de consola.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco

Ejecutar comandos cmd y recuperar Salida.

Publicado por Francisco (7 intervenciones) el 02/08/2014 03:49:11
Si pudieras ser mas especifico y poner el codigo para saber que es exactamente lo que necesitas, seria mas facil ayudarte. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pepe (4 intervenciones) el 04/08/2014 08:58:29
Muy buenos días,

Estoy con una aplicación en C++ para windows, que tiene que ejecutar unos jars externos, y lo que quiero es poder redireccionar la salida de la consola para poder guardar los resultados de la misma.
Ahora mismo estoy ejecutando los jars medante el comando system("XXXXXXX");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pepe (4 intervenciones) el 04/08/2014 11:06:45
He probado también con el comando _popen, a realizar algo tan simple como


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdlib.h>
#include <iostream>
 
int main (int argc, char *argv[]){
    FILE   *chkdsk;
    const int MAX_BUFFER = 2048;
    char buffer[MAX_BUFFER];
 
   chkdsk = _popen( "java -version", "rt" );
   if (chkdsk == NULL) perror ("Error al ejecutar el comando");
   else{
       while( !feof( chkdsk ) ){
                a++;
               if( fgets( buffer, MAX_BUFFER, chkdsk ) != NULL ){
					puts(buffer);
               }else{
                    printf("\nfgets no recupero nada\n");
                }
	}//While
    }//else
  system("pause");
  fclose(chkdsk);
 return 0;
}

Pero no consigo que la función fgets recupere nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pico (37 intervenciones) el 04/08/2014 11:28:58
No sé si se podrá hacer de otra manera, pero al redireccionar se suele hablar de redireccionar a un fichero, con >. De ahí lo lees, y ya lo tienes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pepe (4 intervenciones) el 04/08/2014 11:30:40
Eso intento mediante _popen, pero no lo consigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comandos cmd y recuperar Salida.

Publicado por Pico (37 intervenciones) el 04/08/2014 11:35:08
Tendrías que hacer algo como system("XXXXXXX") > salida.txt.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comandos cmd y recuperar Salida.

Publicado por Tom (619 intervenciones) el 05/08/2014 15:30:44
El problema es que popen() te devuelve un stream con el stdout para el comando.
El comando java -version, escribe su salida en su stderr.

Hay una "solución" que es ejecutar redireccionando la salida de error a la salida standard:

1
2
3
if((pipe = popen("java -version 2>&1", "r")) == NULL) {
             ...
        }

Esto, por ejemplo, funciona bien en Linux:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
/* */
int main(int argc, char *argv[]) {
	FILE	*pipe;
 
	if((pipe = popen("java -version 2>&1", "r")) == NULL) {
		perror("popen");
	} else {
		char	buffer[81];
 
		while(fgets(buffer, 80, pipe) != NULL) {
			printf("-- %s", buffer);
		}
		pclose(pipe);
	}
}

pero no podrás diferenciar lo que es salida "normal" por stdout, de lo que va por la salida de error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar