• Publicidad

Ejecución system() en background en Windows

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ejecución system() en background en Windows

Notapor ricar » 2010-12-07 04:24 @225

Hola a todos.

Quisiera saber si hay alguna forma de ejecutar comandos sobre Windows, con system(), "``", etc. sin que aparezca la pantalla de ejecución sobre el sistema.

No deseo que cuando se ejecuta un comando, por ejemplo un "dir.exe" aparezca en pantalla el comando y el resultado. Me gustaría obtener el resultado en una variable ("'") y que no haya huella en el sistema de lo que se ha ejecutado.

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Publicidad

Re: Ejecución system() en background en Windows

Notapor explorer » 2010-12-07 09:45 @448

¡¡¡Respondida!!!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución system() en background en Windows

Notapor ricar » 2010-12-07 10:10 @465

Hola explorer.

Sí, esa opción la conocía, pero quería saber si había alguna manera más "limpia", puesto que al ejecutar mi programa lanza consolas que aparecen y desaparecen continuamente.

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Ejecución system() en background en Windows

Notapor explorer » 2010-12-07 10:14 @468

¿Las consolas aparecen y desaparecen al ejecutarlas con wperl?

ricar escribiste:Me gustaría obtener el resultado en una variable ("'") y que no haya huella en el sistema de lo que se ha ejecutado.

El resultado de la salida del comando lo puedes capturar usando qx() o las comillas invertidas.

El que no deje rastro en el sistema, es difícil. Los Windows suelen llevar un sistema de conteo que guarda registro de todas las aplicaciones.

Tendrías que entrar en ese registro y cambiarlo. Y creo que es un registro distinto en cada versión de Windows...

ricar escribiste:quería saber si había alguna manera más "limpia"


Quizás te sirvan los módulos Win32::Process y Proc::Background.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución system() en background en Windows

Notapor ricar » 2010-12-11 04:46 @240

Hola, explorer.

Me refiero a que cómo ejecuto muchas veces operaciones o comandos sobre el sistema, pues hay "rastro" visual cada vez que corro el programa. Me hubiera gustado que fuera totalmente "incoloro e inodoro" :P.

Además, como no he realizado un buen trabajo de depuración del mismo, me sale multitud de warnings, del tipo "uninitialized blablabla" y alguna cosilla más que no afecta al resultado del programa pero me "ensucian" el mismo.

Muchas gracias por la info, le daré una vuelta a ver si me sirve para lo que quiero.

Saludos,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Ejecución system() en background en Windows

Notapor explorer » 2010-12-11 07:12 @342

No sé si leíste el hilo que te he enlazado más arriba. Allí se comenta que wperl sí que arranca el programa sin que aparezca la consola. El problema estaba en que dentro del programa había llamadas a system(), y era justo en ese momento cuando se crea otra ventana (system() arranca un 'shell' del sistema para ejecutar el comando que le pasamos como argumento, y en Windows, un 'shell' es la consola de comandos).

Además, es cierto que wperl no usa la consola, que STDIN, STDOUT y STDERR no están asociados, por lo que no puedes leer ni escribir hacia ellos (salvo que les abras tú, claro).

Y para evitar las ventanas generadas por system(), debes cambiarlos por el procedimiento indicado con el módulo Win32::Process.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución system() en background en Windows

Notapor ricar » 2010-12-16 11:33 @523

Hola Explorer.

No lo leí completamente. Probaré el módulo Win32::Process.

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Ejecución system() en background en Windows

Notapor ricar » 2010-12-21 03:13 @176

Hola, explorer.

explorer escribiste:Y para evitar las ventanas generadas por system(), debes cambiarlos por el procedimiento indicado con el módulo Win32::Process.

Respecto a esta parte, no se puede utilizar Win32::Process para leer la ejecución de un comando.

Yo utilizo realmente las comillas invertidas (no lo expliqué correctamente en el hilo abierto) para extraer la información del ejecutable, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $variable = `dir.exe c:\\`;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


De esta forma, obtengo los directorios que haya en C:; con Win32::Process sólo puedes arrancar procesos, pararlos, obtener su PID, etc. pero no la salida del proceso/comando.

Con lo que vuelvo a estar como al principio :?. ¿Alguna alternativa?

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Ejecución system() en background en Windows

Notapor explorer » 2010-12-21 09:54 @454

Una alternativa 'sucia' sería guardar el resultado de la ejecución en un fichero temporal, y luego desde Perl, leerlo.

Como no tengo Windows, no sé decirte más posibilidades, para que no llamen la atención en pantalla.

Yo, lo único que recuerdo, hace ya años, cuando tuve que hacer algunas tareas en Windows, las hacía todas con wperl, y nunca me hizo falta usar el system(). Por ejemplo, en lugar de hacer un dir, usaba opendir/readdir para leer los directorios.

A ver si alguien que está en Windows, te echa una mano mejor que la mía.

Quizás... exista algún módulo más en CPAN, para estos casos. Hay algunos muy raros, como IPC::Exe. Incluso he encontrado uno específico para ocultar procesos en Windows: Win32::Process::Hide.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución system() en background en Windows

Notapor wanako » 2010-12-22 09:07 @421

ricar escribiste:no se puede utilizar Win32::Process para leer la ejecución de un comando.

Depende, ¿capturando STDOUT, tal vez?
ricar escribiste:Yo utilizo realmente las comillas invertidas (no lo expliqué correctamente en el hilo abierto) para extraer la información del ejecutable, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $variable = `dir.exe c:\\`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna alternativa?

En Perl "There's More Than One Way To Do It"

Las comillas invertidas no generan nuevas consolas, system() sí las genera y no captura STDOUT. Para mejorar el script deberías postearlo.

Por razones inexplicables que tiene el mundo de la informática tuve que hacer uso de Windows hace poco, donde 'descubro' que wperl funciona... cuando quiere.

También descubro una buena combinación, wperl + Win32 module + redirección:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use Win32;
  3.  
  4. Win32::SetChildShowWindow(0);
  5.  
  6. my $salida = qx(dir c:\\ 2>NUL); # /dev/null?
  7. ## $salida = qx(dir c:\\ 2>error.log);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En Strawberry el módulo Win32 es parte del core, creo, y para no usar accesos directos con wperl nada mejor que PAR y crear con el comando 'pp' un exe con la opción --gui para que no aparezcan las consolitas.
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados