elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Como veo el standardoutput de la CMD en la própia CMD?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como veo el standardoutput de la CMD en la própia CMD?  (Leído 2,248 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Como veo el standardoutput de la CMD en la própia CMD?
« en: 11 Enero 2013, 10:29 am »

Estoy intentando hacer pruebas,

Lo que quiero es poder abrir un comando en la CMD y que la consola no se cierre, por ejemplo:

Código
  1.  My_Process_Info.FileName = "CMD.exe"
  2.        My_Process_Info.Arguments = "/k pause"

Pero la CMD se cierra.

Así que he intentado ejecutar un FOR de Batch muy largo en la CMD para ver si así no se cierra...
Código
  1.        My_Process_Info.FileName = "CMD.exe" ' Process filename
  2.        My_Process_Info.Arguments = "/k For /L %a in (1,1,100000) do echo afijgifjigjfgjifjgi" ' Process arguments

y no, no se cierra (Porque el FOR tarda en finalizar, cuando acaba si que se cierra claro xD) pero ahora lo que ocurre además es que el output de la CMD no se muestra en la CMD!, es decir, el FOR no muestra nada.

EDITO: Vale, he descubierto que el output no se muestra en la CMD porque al habilitar la propiedad de redireccionar el Standard u Error output, no muestra el output en la CMD.


Así que quiero solucionar los dos problemas:

1. Que la CMD no se cierre cuando finaliza la orden, el comando.
2. Que el output se muestre en la CMD cuando habilito la propiedad RedirectStandardOutput = True  y/o RedirectStandardError = True




Este es el code, es un snippet que estoy intentando hacer:
Código
  1. Dim My_Process As New Process()
  2.        Dim My_Process_Info As New ProcessStartInfo()
  3.  
  4.        My_Process_Info.FileName = "CMD.exe" ' Process filename
  5.        My_Process_Info.Arguments = "/k For /L %a in (1,1,100000) do echo afijgifjigjfgjifjgi" ' Process arguments
  6.        My_Process_Info.UseShellExecute = False ' Don't use system shell to execute the process
  7.        My_Process_Info.CreateNoWindow = False ' Show the CMD Window
  8.        My_Process_Info.RedirectStandardOutput = True '  Redirect (1) Output
  9.        My_Process_Info.RedirectStandardError = True ' Redirect non (1) Output
  10.        My_Process.EnableRaisingEvents = True
  11.        My_Process.StartInfo = My_Process_Info
  12.        My_Process.Start() ' Run the process
  13.        My_Process.WaitForExit() ' Wait X miliseconds to kill the process
  14.  
  15.        Dim Process_StandardOutput = My_Process.StandardOutput.ReadToEnd() ' Stores the Standard Output (If any)
  16.        Dim Process_ErrorOutput = My_Process.StandardOutput.ReadToEnd() ' Stores the Error Output (If any)
  17.        Dim Process_StartTime As String = My_Process.StartTime ' Stores the time when the process was launched
  18.        Dim Process_EndTime As String = My_Process.ExitTime ' Stores the time when the process was finished
  19.        Dim ERRORLEVEL = My_Process.ExitCode ' Stores the ExitCode of the process
  20.  
  21.        Dim result = Process_StartTime & vbNewLine & Process_EndTime & vbNewLine & ERRORLEVEL
  22.  
  23.        MsgBox(result)
  24.        MsgBox(Process_StandardOutput)
  25.        MsgBox(Process_ErrorOutput)


« Última modificación: 11 Enero 2013, 10:39 am por EleKtro H@cker » En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Como veo el standardoutput de la CMD en la própia CMD?
« Respuesta #1 en: 11 Enero 2013, 14:47 pm »

EDITO: Vale, he descubierto que el output no se muestra en la CMD porque al habilitar la propiedad de redireccionar el Standard u Error output, no muestra el output en la CMD.

Eso se debe a que tienes que inicializar la propiedad "UseShellExecute" a False, ya que para redireccionar los flujos de entrada/salida/error utilizarás la clase Process. UseShellExecute, como habrás visto crea una nueva instancia del CMD en la ruta donde se encuentre el ensamblado, con la que puedes interactuar como si de la Shell del sistema se tratase, solo que no puedes capturar los errores y las salidas.

Básicamente lo que hago es escribir en el Flujo de entrada del CMD, de esta forma consigo enviarle comandos en un Bucle que tiene como condición ejecutar los comandos hasta que el Comando sea nulo. En segundo plano capturo el evento OutPutDataRecieved asíncronicamente lo que me permite Leer y Escribir en la CMD a la vez ;)

Código
  1. Module Module1
  2. Module Module1
  3.    Sub Main()
  4.        Dim p As New Process()
  5.        With p.StartInfo
  6.            .FileName = "cmd"
  7.            .UseShellExecute = False
  8.            .CreateNoWindow = False
  9.            .WindowStyle = ProcessWindowStyle.Hidden
  10.            .RedirectStandardOutput = True
  11.            .RedirectStandardInput = True
  12.            .RedirectStandardError = True
  13.        End With
  14.        AddHandler p.OutputDataReceived, AddressOf OutPutDataArrival
  15.        p.Start()
  16.        p.BeginOutputReadLine()
  17.        Dim StdInput As IO.StreamWriter = p.StandardInput
  18.        Dim Comando As String
  19.        Do
  20.            Comando = Console.ReadLine
  21.            StdInput.WriteLine(Comando)
  22.        Loop Until Comando Is String.Empty
  23.        StdInput.Close()
  24.    End Sub
  25.    Private Sub OutPutDataArrival(ByVal Sender As Object, ByVal e As DataReceivedEventArgs)
  26.        Console.WriteLine(e.Data)
  27.    End Sub
  28. End Module
  29.  

Saludos!


En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: Como veo el standardoutput de la CMD en la própia CMD?
« Respuesta #2 en: 11 Enero 2013, 15:27 pm »

Demasiado bueno para ser cierto, leer, escribir, y sin cerrarse la CMD

Pero... ¿Hay forma de modificar el SUB OutPutDataArrival para hacerlo funcionar en un WinForm?

gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
GTA: Como crear tu propia ciudad????
Juegos y Consolas
Carloswaldo 3 4,288 Último mensaje 8 Febrero 2006, 13:22 pm
por Neobius
Como matar el proceso de la propia aplicacion
Programación Visual Basic
Timerlux 7 2,633 Último mensaje 15 Octubre 2007, 17:42 pm
por Timerlux
Como creo mi propia UDF?
Bases de Datos
Skeletron 9 7,609 Último mensaje 21 Marzo 2010, 18:32 pm
por Skeletron
como conectar dentro de mi red propia
Redes
nekarcito 2 2,562 Último mensaje 27 Junio 2010, 21:49 pm
por madpitbull_99
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines