Hola, estyo haciendo un programa en el que utilizo algunos archivos .bat, los mando llamar con la instruccion Shell, pero los ajecuta asincronamente
Shell App.Path & "\respaldo.bat", vbNormalFocus
hay alguna manera de hacer que mi programa espere hasta que el archivo bat termine su ejecución??
Seguramente no, lo veo difil vamos alomejor con alguna api de estas raras... no creo, pero si el archivo .bat no interacciona con el usuario siempre puedes ponerle un timer antes de abrir el siguiente .bat
Una forma sencilla es poner un timer o sleep.
Tambien puedes hacer que cuando termine el batch, este cambie la barra de titulo...y vb al detectar que la barra de titulo de la ventana es "Batch terminado", pues pasa a la siguiente accion ;)
La pregunta es... ¿no puedes poner las instrucciones que hace el bat dentro del propio programa?
Cuentanos un poco más tu caso a ver si encontramos otra alternativa ;)
la verdad es que el bat lo que hace es comrimir un archivo, no se como hacerlo desde VB por eso opte por hacer un bat que se encargara de eso
El archivo bat contiene lo siguiente:
@Echo off
c:\archiv~1\winzip\winzip32.exe -a -r C:\DOCUME~1\ocelaya\MISDOC~1\INDICA~1\Respaldo28092006.zip C:\DOCUME~1\ocelaya\MISDOC~1\INDICA~1\Respaldo28092006.bak
se que se puede hacer en VB pero no se como
Se hace con Shell()
Shell("C:\calc.exe")
Pd: No hace falta que utilices @echo off, ni exit.
:huh: el problema de la instrucción shell es que ejecuta el archivo en forma asincrona y lo que necesito es esperar a que termine de comprimir el archivo para poder continuar
me comentaron que hay una dll, que hace eso, alguien sabe cual es?
Claro que existe.
Acordate que cualquier *.bat ejecuta desde una consola de DOS :).
Por Ejemplo en WinXP el batch ejecuta junto el el cmd.Uso Pausa porque el sleep es horrendo, con pausa puedo seguir tranquilamente con otras funciones sin problemas, hace una pausa a la siguiente linea pero solo dentro de la funcion.
Citar
'PROCESOS
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'PAUSA
Private Declare Function GetTickCount Lib "Kernel32.dll" () As Long
Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
'FUNCION DE SLEEP PARA ESPERAR UNOS MILISEGUNDOS
Sub Pausa(HowLong As Long)
Dim u%, tick As Long
tick = GetTickCount()
Do
u% = DoEvents
Loop Until tick + HowLong < GetTickCount
End Sub
Y aca la funcion en concreto:
CitarFunction ExeEspera(COMANDO as String)
Dim hProcess As Long
Dim RetVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(COMANDO, vbMinimizedNoFocus))
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Pausa 100
Loop While RetVal = STILL_ACTIVE
End Function
ya lo probe y funciono muy bien, GRACIAS!!!!!
Mira aqui te dejo un code para comprimir un archivo desde vb (Muy util para hacer worms xDD )
Dim Rutaexe As String
Dim Rutazip As String
Rutazip = "C:\ & "nombre" & ".zip"
Rutaexe = "C:\tu_aplicacion.exe"
Shell ("C:\Archivos de programa\Winrar\WinRar.exe a -m5 -ep " & Rutazip & " " & Rutaexe) 'se ejecutara el winrar y es comprimira el archivo tu_aplicacion.exe como nombre.zip
Shell ("C:\Archivos de pograma\Winzip\Winzip32.exe -a" & Rutazip & "" & Rutaexe) 'igual que el anterior pero lo hara con el winzip en vez de el winrar