Programación General > Visual Basic 6.0 e inferiores

 Ejecutar Un Bat Desde Vb

(1/2) > >>

Jeremy:
Hola amig@s. Necesito ejecutar un bat(fichero por lotes MS-DOS). El bat se encarga de hacer una copia de seguridad del correo del cliente, pero esta copia la hace sólo los miércoles.
Con VB podría ejecutar ese bat, pero cómo lo hago?. He encontrado en internet una instrucción para ejecutar comandos de MS-DOS desde VB. El código sería más o menos así:

--- Código: Text --- Private Sub Form_Load()If Format(Date, "dddd") = "miércoles" Then  '---> Compruebo el día de la semana    Label1.Caption = "Se está realizando la copia del correo. Por favor espere..."    Shell "cmd.exe /c archivo.bat",vbhide '---> Con esta línea abriría una consola de MS-DOS, ejecutaría el bat y la consola como tal estaría oculta gracias al parámetro VBHIDE.else    unload Me    endEnd IfEnd Sub  
Lo único que vería el usuario sería un form indicándole a través de un Caption que se está ejecutando la tarea indicada.
He probado estas líneas pero el caso es que el form no se muestra, el bat se ejecuta correctamente, pero lo que quiero es que el form se mantenga visible hasta que el bat termine con lo que está haciendo. Por otro lado seguro que hay una mejor forma de hacerlo, espero puedan ayudarme.

De antemano, gracias a tod@s.

Un saludo, :hola:

tyron:
Hola, puedes probar a poner el formulario por encima de todo, para que no se oculte. Espero te pueda servir, un saludo.

DiabloRojo:
Hola.
No sé mucho de la función Shell pero por que no intentas pasar como parámetro vbNormalNoFocus en vez de vbHide. Revisa en la ayuda para que veas que hace cada constante.


DiabloRojo.

Jeremy:
Gracias a los dos compañeros. Ahora tengo el siguiente problema. Cuando ejecuto este código, cómo hago para que cuando termine el bat, se cierre el form de visual?. Ahora al ejecutarlo, cuando termina el bat, el form de VB se queda abierto. Repito el código:


--- Código: Text --- Private Sub Form_Load()BeepIf Format(Date, "dddd") = "miércoles" Then    Me.Caption = "Hoy es " & Format(Date, "dddd")    Label1.Caption = "Se están copiando los ficheros de correo. Por favor espere..."    Shell "cmd.exe /c archivo.bat", vbMinimizedFocus    'Unload Me    'EndElse    Unload Me    EndEnd IfEnd Sub  
He probado a poner después de la línea del Shell, un Unload Me y luego End. Pero lógicamente así no funciona, la aplicación se cierra enseguida. Mi idea es que el usuario pueda ver el form de VB con el mensaje de que se está ejecutando el bat, y se quite cuando haya terminado para que este pueda trabajar en su PC.

Gracias por vuestra ayuda.

Un saludo,

tyron:
Puedes poner un timer para que vaya detectando, mediante el nombre de la ventana de MSDOS, si existe, ya que si no existe es que ha terminado. Te paso un codigo de ejemplo, prueba a ver si te sirve.


--- Código: Text ---'Declaramos las funciones correspondientes Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _       (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _       (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As _       Long) As Long 
Esta es una función que nos devuelve el nombre de clase de una ventana de la que solo conocemos el título.


--- Código: Text ---Public Function NombreClase(NombreVentana As String) As StringDim hWnd As LongDim lpClassName As StringDim nMaxCount As LongDim lresult As Long    nMaxCount = 256lpClassName = Space(nMaxCount)hWnd = FindWindow(vbNullString, NombreVentana)lresult = GetClassName(hWnd, lpClassName, nMaxCount)NombreClase = Left$(lpClassName, lresult)End Function 
Así solo deberias pasarle como parámetro el título de la ventana MSDOS que ejecuta el archivo de proceso por lotes.

Esta función te devuelve verdadero si encuentra la ventana de MSDOS


--- Código: Text ---Function Ejecutando(NombreClase As String) As BooleanEjecutando = (FindWindow(NombreClase, vbNullString) <> 0)End Function 
Espero te sirva. Un saludo

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa