none
Error con el comando Shell.

    Question

  • Hola a todos,

    Estoy intentando utilizar la funcion Shell, que parece muy fácil, ejecutar un archivo bat:

    Shell(

    "E:\directorio\cmd /k E:\directorio\rege.BAT", AppWinStyle.NormalFocus)

    Cuando termina de hacer todo lo que tiene que hacer el archivo por lotes, me saca el siguiente mensaje:

    COMMAND.COM no válido

    No se puede cargar COMMAND, sistema interrumpido

    y se me queda en este estado la ventadas de DOS hasta que yo la cierro.

    Si lo ejecuto desde el compilador de Visual Estudio, lo hace bien pero cuando publico la aplicaión, me saca el mensaje.


    Si alguien me puede aclarar algo se lo agradezco.

    Monday, November 23, 2009 12:20 PM

Answers

All replies

  • hola

    te recomendaria no hacer uso del Shell, utiliza la clase Process:

    Process Class
    ProcessStartInfo Class

    por ahi estos link ayuden en la tarea:

    como ejecuto comandos del cmd

    How can I run another application or batch file from my Visual C# .NET code


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by Xemab Tuesday, November 24, 2009 9:35 AM
    Monday, November 23, 2009 12:54 PM
  • Hola de nuevo;

    Disculpa no haber contestado tu mail antes pero anduve un poco liado.

    He probado lo que me comentaste de la clase Process, y me vuelve a dar el mismo error al terminar de ejecutar el archivo por lotes.

    En tiempo de depuración no me da ningun tipo de error como el comando Shell, pero en ejecución ya publicado me da este error de no poder cargar el command.com.

    Si tuvieras una ligera idea de que pudiera ser, te agradeceria muchisimo tu ayuda incondicional. 

    Salu2
    Monday, November 30, 2009 9:18 AM
  • Hola Xemab,
    Umh tengo una pregunta, ¿ Has probado a poner unicamente Shell() o Processo.Start() y entre los parentesis la ruta de tu .bat?

    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 9:27 AM
    Moderator
  • Hola que tal;


    He puesto lo siguiente:


    Shell(

    "E:\directorio\rege.bat", AppWinStyle.NormalFocus)

    Process.Start(

    "e:\directorio\rege.bat")

    Salu2

    Monday, November 30, 2009 9:30 AM
  • Podrias poner el .bat, para comprobarlo?
    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 9:52 AM
    Moderator
  • Hola,

    Esto es lo que hace el .bat,   ejecuta una aplicación en clipper,


    E:
    CD \DIRECTORIO
    REGENERA.EXE



    salu2
    Monday, November 30, 2009 9:56 AM
  • umh, si en la ruta que le indias al shell, ya tienes e: directorio, pienso que no deberias d eponerlo en el .bat, por otro lado puedes llamar directamente al fichero exe
    es decir,
    Dim p As ProcessStartInfo = new ProcessStartInfo()
            p.WindowStyle = ProcessWindowStyle.Hidden
     p.start("e:\regenera.exe")

    La aplicación necesita algun usuario especial para ser ejecuta?

    si es asi tendrías que indicarselo.

    Prueba con esto a ver si ahora te funciona :s

    PD: "E" es una unidad de red?

    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 10:04 AM
    Moderator

  • Hola ,

    Me da el siguiente error al copiar tu codigo:

    Error 1 'start' no es un miembro de 'System.Diagnostics.ProcessStartInfo'. E:\DESARROLLO VISUAL\Form3.vb 27 9 NB


    Salu2
    Monday, November 30, 2009 10:13 AM
  • Umh, 
                Dim proceso As New ProcessStartInfo
                proceso.FileName = "e:\regenera.exe"
                proceso.WindowStyle = ProcessWindowStyle.Hidden
                Process.Start(proceso)

    vamos a probar también esto shell("e:\regenera.exe",AppWinStyle.Hide)
    Si tienes que esperar a que acabe la ejecución ponle un ,true detras del hide.



    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 10:25 AM
    Moderator
  • Hola,


    He probado de las dos formas;


    En el primer caso (Process) en tiempo de depuración lo hace bien, pero una vez publicado en tiempo de ejecución, me da el siguiente error, sin haber hecho nada más:

    System.ComponentModel.Win32Exception: El parámetro no es correcto
       en System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
       en System.Diagnostics.Process.Start()
       en System.Diagnostics.Process.Start(ProcessStartInfo startInfo)



    En el segundo caso (Shell)  en tiempo de depuracion lo hace bien , pero una vez publicado en tiempo de ejecucion, se que da un proceso internamente que no acaba y me absorve el 50% del procesador hasta que le digo finalizar tarea.

    Tendrá que ver, que al no ser una plicación de windows la que ejecuto faltaría importar algo para que se pueda ejecutar?.

    salu2

    Monday, November 30, 2009 10:39 AM
  • con shell, si le pones que espere hasta que termina, ponle despues Processo.kill( y el nombre) creo recordar que era, para que mate el proeso haber si de esa manera funciona....
    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 10:42 AM
    Moderator
  • Hola,


    He probado todo lo que hemos comentado, incluso el Process.kill(),  y antes de que llegue a ejecutarse la linea de comando Kill, ( estoy hablando siempre cuando publico la aplicación ), me sale el siguiente mensaje:


                                                       COMMAND.COM no válido

    No se puede cargar COMMAND, sistema interrumpido

    en la mima ventana de MSDOS.


    Porque? en Visual Studio, todo lo que hemos comentado funciona, y una vez publicado NO, bueno si se te ocurre algo me lo comentas por favor, para mi es bastante importante para poder emigrar poco a poco una gestión a Visual.

    Salu2

    Monday, November 30, 2009 12:12 PM
  • umh
    el error que te indica es como si no encontrará el Propio MSDOS, umh
    en el ordenador cliente, prueba lo siguiente dale inicio--> ejecutar y escribe cmd
    haber si te funciona...


    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 12:15 PM
    Moderator
  • Si que funciona,

    de hecho llego a ver como se abre la ventana de msdos, y en el titulo de la ventana ejecuta el comando cmd.exe,
    ejecuta la aplicacion REGENERA.EXE, y cuando termina me saca el error y no se cierra la ventana.

    lo que no entiendo es porque cuando termina necesita volver a cargar el command.com, lo estoy ejecutando en una maquina con xp, lo unico que puedo hacer es probarlo en otro sistema operativo.


    Monday, November 30, 2009 12:24 PM
  • Lo que es curioso, es que ejecuto en vez mi aplicacion de clipper el bloc de notas de windows, y lo hace bien , se ejecuta, lo cierro y vuelve al estado correcto.

    Tendra que que ver que es una aplicacion de 16 bits en vez de 32?,
    Monday, November 30, 2009 12:28 PM
  • umh, yo entiendo que no tendrá que ver,

    Revisa que si ejecutas tu aplicación y la cierras, se quita de las tareas.... puede ser por ello que no lo este haciendo correctamente ¿??

    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 12:33 PM
    Moderator
  • efectivamente, cuando ejecuto mi aplicacion se abre un proceso que se llama "ntvdm.exe" y cuando mi aplicacion acaba se cierra solo.

    Monday, November 30, 2009 12:38 PM
  • Intenta lo siguiente, create un pequeño proyecto, en blanco, y haz unicamente este proceso, que estas definiendo y pruebalo haber si te funciona.

    Otra prueba que se me ocurre es q cuando ejecutes con el process, compruebes en las tareas del ordenador si la tarea se ha quedado bloqueada...

    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 12:43 PM
    Moderator
  • Todas las pruebas las estoy haciendo con un unico formulario y un boton para hacer la llamada.

    Efectivamente, cuando la ejecuto en el adminitrador de tareas se me habre un proceso , el que te he comentado antes:

    "ntvdm.exe"  y me absorve el 50% del procesador sin hacer nada mas, hasta que finalizo yo manualmente la tarea, ya que por si solo no se cierra.
    Monday, November 30, 2009 12:50 PM
  • umh, podrias subir el proyecto a algun sitio para q me lo baje y lo miro un poco ams en detalle?
    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 1:14 PM
    Moderator
  • me he dado cuenta que el problema está en la unidad, es decir.

    Cuando yo ejecuto el comando Shell en cualquier otro directorio, siempre que sea en "C:" la aplicacion se ejecuta y termina bien. pero si yo hago un cambio de unidad o llamo a la aplicacion que la tengo en la unidad "E:" es cuando no funciona , como si el cmd.exe se ejecuta desde C y luego se encuentra en E.

    No se una cosa muy rara pero de momento me vale porque desde C ya puedo hacer lo que queria.

    Muchas gracias por tu atención, creo que me has hecho profundizar mas en el tema que me tenia comida la moral, como una cosa tan sencilla se puede complicar tanto. Bueno lo dicho eternamente agradecido.


    Salu2

    Monday, November 30, 2009 2:26 PM
  • el tema de las unidades a veces da bastante guerra, si son unidades de red aun mas, asi q... bueno si encuentras la solucion posteala porque puede que alguien le sea de utilidad
    Mi Blog: Jtorrecilla
    Monday, November 30, 2009 2:29 PM
    Moderator