Hola, buenos días.
Bueno, la cosa esque estoy haciendo una Interfaz Gráfica para un programa que se ejecuta por línea de comandos. El código es este:
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Button6.Text = "Mostrando información en Shell..."
Button6.Enabled = True
Shell("cmd.exe /c @echo off")
Shell("cmd.exe /c ndstool.exe -l game.nds", AppWinStyle.NormalFocus)
Shell("cmd.exe /c pause")
End Sub
Eso hace que mediante el ndstool.exe se muestre en el Shell una lista con los archivos que tiene un juego por dentro, pero cuando imprime la lista, el pause no la detiene para poder visualizarla, si no que borra la lista y pone "Pulse una tecla para continuar".
¿Hay alguna manera de hacer que pare sin que borre los datos?
Saludos.
Has intentado usar /k en lugar de /c como argumentos para cmd.exe?
cmd.exe /k ndstool.exe -l game.nds
Has intentado guardar la salida del comando en un archivo de texto ?
cmd.exe /c ndstool.exe -l game.nds > Salida.txt
Has intentado guardar tu secuencia de comandos en un .BAT y luego llamarlo desde tu programa?
Pero ya que estas haciendo una interfaz grafica, lo mejor seria que utilizaras la clase Process que esta en System.Diagnostics, y rediriges la salida a un RichtextBox, asi te evitarias abrir un CMD en una ventana independiente, y mostrarias los resultados del comando en tu Interfaz personalizada, si te interesa hacerlo asi, aqui te pongo un ejemplo:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Command As New Process 'Creamos la instancia Process
Command.StartInfo.FileName = "cmd.exe" 'El proceso en si es el CMD
Command.StartInfo.Arguments = "/c " & TextBox1.Text
'Aqui le damos los parametros /c y el nombre del archivo a ejecutar
'En tu caso sustituirias TextBox1.Text por "ndstool.exe -l game.nds"
Command.StartInfo.RedirectStandardError = True 'Redirigimos los errores
Command.StartInfo.RedirectStandardOutput = True 'Redirigimos la salida
Command.StartInfo.UseShellExecute = False
'Para redirigir la salida de este proceso esta propiedad debe ser false
Command.StartInfo.CreateNoWindow = True
'Para que no abra la ventana del CMD
Try
Command.Start()
Dim Output As String = Command.StandardOutput.ReadToEnd() _
& vbCrLf & Command.StandardError.ReadToEnd() 'Guardamos las salidas en un string
RichTextBox1.Text = Output 'Desplegamos la salida en nuestro RichTextBox
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
'En caso de cualquier error de ejecucion
End Try
End Sub
End Class
Con este codigo al presionar el boton el comando escrito en el textbox es ejecutado y te muestra la salida en el RichtextBox como cuando ejecutas el comando desde el simbolo del sistema.
Notas:
El ejemplo esta probado en Visual Studio 2008
Para probar el ejemplo creamos un nuevo proyecto de aplicacion de windows VB.net y agregamos los siguientes controles
Boton con el nombre Button1
Text box con el nombre TextBox1
Rich text box con el nombre RichTextBox1
El Formulario principal tiene el nombre Form1
En si son los nombres por defecto cuando colocas los controles, pero no esta de mas ponerlo como referencia
espero algo de esto te ayude amigo
¡Buf! Muchísimas gracias amigo, en serio, así el programa está muchísimo mejor que abriendo ventanas de comando externas. ;D
Me reitero de nuevo, muchísimas gracias. ^_^
El problema es que tienes los SHELL separados, entonces por cada vez que lo tienes se abre un cmd.exe diferente, intenta así:
Shell("cmd.exe /c @echo off & ndstool.exe -l game.nds & pause", AppWinStyle.NormalFocus)
Saludos
Gracias tambien por la respuesta Novlucker, aunque haya usado la que me ha dicho el amigo Xtriker, esa tambien me puede ser útil para otros proyectos. ;)
Sin lugar a dudas la opción de Xtriker es la mejor y "más correcta", mi aclaración era simplemente para hacerte notar el error de ejecutar varios shell, ya que ejecutas un programa cada vez (en este caso el cmd.exe), y no es lo que necesitas si vas a correr varios comandos uno detras de otro :P
Saludos