• Domingo 22 de Diciembre de 2024, 19:04

Autor Tema:  Ejecutar Un Bat Desde Vb  (Leído 7239 veces)

Jeremy

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Ejecutar Un Bat Desde Vb
« en: Domingo 5 de Junio de 2005, 22:44 »
0
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
  1.  
  2. Private Sub Form_Load()
  3. If Format(Date, "dddd") = "miércoles" Then  '---> Compruebo el día de la semana
  4.     Label1.Caption = "Se está realizando la copia del correo. Por favor espere..."
  5.     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.
  6. else
  7.     unload Me
  8.     end
  9. End If
  10. End Sub
  11.  
  12.  

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:
"Cuando quieres algo, todo el Universo conspira para que realices tu deseo..."

tyron

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #1 en: Lunes 6 de Junio de 2005, 00:57 »
0
Hola, puedes probar a poner el formulario por encima de todo, para que no se oculte. Espero te pueda servir, un saludo.

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #2 en: Lunes 6 de Junio de 2005, 03:58 »
0
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

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #3 en: Lunes 6 de Junio de 2005, 11:58 »
0
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
  1.  
  2. Private Sub Form_Load()
  3. Beep
  4. If Format(Date, "dddd") = "miércoles" Then
  5.     Me.Caption = "Hoy es " & Format(Date, "dddd")
  6.     Label1.Caption = "Se están copiando los ficheros de correo. Por favor espere..."
  7.     Shell "cmd.exe /c archivo.bat", vbMinimizedFocus
  8.     'Unload Me
  9.     'End
  10. Else
  11.     Unload Me
  12.     End
  13. End If
  14. End Sub
  15.  
  16.  

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,
"Cuando quieres algo, todo el Universo conspira para que realices tu deseo..."

tyron

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #4 en: Lunes 6 de Junio de 2005, 13:45 »
0
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
  1. 'Declaramos las funciones correspondientes
  2.  
  3. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  4.        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  5.  
  6. Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
  7.        (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As _
  8.        Long) As Long
  9.  

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
  1. Public Function NombreClase(NombreVentana As String) As String
  2. Dim hWnd As Long
  3. Dim lpClassName As String
  4. Dim nMaxCount As Long
  5. Dim lresult As Long
  6.    
  7. nMaxCount = 256
  8. lpClassName = Space(nMaxCount)
  9. hWnd = FindWindow(vbNullString, NombreVentana)
  10. lresult = GetClassName(hWnd, lpClassName, nMaxCount)
  11. NombreClase = Left$(lpClassName, lresult)
  12. End Function
  13.  

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
  1. Function Ejecutando(NombreClase As String) As Boolean
  2. Ejecutando = (FindWindow(NombreClase, vbNullString) <> 0)
  3. End Function
  4.  

Espero te sirva. Un saludo

toten

  • Miembro MUY activo
  • ***
  • Mensajes: 140
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #5 en: Lunes 6 de Junio de 2005, 16:49 »
0
prueba ver con la funcion DOEVENTS a ver si te sirve....
[size=109]Andres Eloy Blanco Madriz [ToT3n][/b][/size]
[size=109]Voy Hablando Y Con El Maso Dando...[/size]
[size=109]Solo Soy La Sombra Del Lado Oscuro De Tu Alma...[/size]
[size=109]Y A La Hora De La Verdad Yo Solo Se Que No Se Nada...[/size]
[size=109]|**VENEZUELA**|[/size]

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #6 en: Martes 7 de Junio de 2005, 17:55 »
0
A ver utiliza el comando Shell y la api Sleep para evitar cargar controles:
Código: Text
  1. Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  2. Private Sub Form_Load()
  3. On Error Resume Next
  4. Dim x
  5. x = Shell (El path del archivo & "\file.bat", 0) 'Se oculta y se pasa el foco a la ventana oculta.
  6. AppActivate x 'Activa el .bat
  7. Sleep (5000) '5 Segundos; calcula cuanto tiempo toma en cargarse el archivo y coloca el valor en la api.
  8.  
  9.  
Ojala te sirva.
Chao.
El pasado son solo recuerdos, el futuro son solo sueños

tyron

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: Ejecutar Un Bat Desde Vb
« Respuesta #7 en: Martes 7 de Junio de 2005, 18:04 »
0
Hola, con respecto al post de RadicalEd, solo decir a nuestro amigo Jeremy que depende de en que ordenador lo ejecute, el .bat tardará unos milisegundos (tal vez segundos) mas, o menos, en ejecutarse. Para que lo tenga en cuenta. Un saludo.

Cyclop

  • Miembro MUY activo
  • ***
  • Mensajes: 323
    • Ver Perfil
    • http://www.geocities.com/icotext/spanish/
Re: Ejecutar Un Bat Desde Vb
« Respuesta #8 en: Martes 7 de Junio de 2005, 21:54 »
0
Deja me ver si entendi bien, quieres ejecutar un bat para que te realice una copia de segurida, que estaria de esta forma:

Backup.Bat
Pkzip c:\mizip c:\misistema\data\*.*

Por que no usas las Dlls aZip32.Dll, aUnZip32.Dll y lo haces que te muestre un progress bar, mientras comprime los archivos.

Salu2

Cyclop
Icotext Evolution v0.5 para los amantes del ASCII Art
http]