[VB.Net] Duda con Shell

Iniciado por TheKillerWantsYou, 17 Septiembre 2009, 12:42 PM

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

TheKillerWantsYou

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:

Código (vbnet) [Seleccionar]
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.






Atrum

#1
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:

Código (vbnet) [Seleccionar]

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

TheKillerWantsYou

¡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. ^_^






Novlucker

El problema es que tienes los SHELL separados, entonces por cada vez que lo tienes se abre un cmd.exe diferente, intenta así:

Código (vbnet) [Seleccionar]
Shell("cmd.exe /c @echo off & ndstool.exe -l game.nds & pause", AppWinStyle.NormalFocus)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

TheKillerWantsYou

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.  ;)






Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein