¿Cómo esperar a que finalice un proceso antes de ejecutar otro proceso en un archivo por lotes? Digamos que tengo un proceso notepad.exe
que necesito matar antes de ejecutar wordpad.exe
. Luego, cuando termina el wordpad.exe
, necesito iniciar notepad.exe
nuevamente. ¿Cómo puedo hacer eso?Cómo esperar a que finalice un proceso para ejecutar otro proceso en el archivo por lotes
Respuesta
intentar algo como esto ...
@ECHO OFF
PSKILL NOTEPAD
START "" "C:\Program Files\Windows NT\Accessories\wordpad.exe"
:LOOP
PSLIST wordpad >nul 2>&1
IF ERRORLEVEL 1 (
GOTO CONTINUE
) ELSE (
ECHO Wordpad is still running
SLEEP 5
GOTO LOOP
)
:CONTINUE
NOTEPAD
que utiliza PSLIST
y PSEXEC
, pero también se podría utilizar TASKKILL
y TASKLIST
. El >nul 2>&1
está ahí para ocultar toda la salida de PSLIST
. La línea SLEEP 5
no es necesaria, pero está ahí para restringir la frecuencia con la que se comprueba si WordPad aún se está ejecutando.
TASKLIST no recibe argumentos de esta manera. ¿Cómo puedo hacerlo usando la lista de tareas? –
Parece que 'TASKLIST' no establece el' ERRORLEVE'. Puede canalizar la salida de 'TASKLIST' a' FIND' como una solución alternativa. Algo como esto, 'TASKLIST | ENCONTRAR/I "wordpad" '. – aphoria
Esto es bastante débil. Use 'start/wait' como naturaleza prevista. –
Uso inicio/w ProgramName esperar el final de ProgramName
START /W notepad
ECHO Back from notepad
START /W wordpad
ECHO Back from wordpad
START /W notepad
Esto es mucho más simple que un lote completo y funciona perfectamente. Tenga en cuenta que necesitará agregar el argumento * title * si usa comillas para el nombre de su programa. Consulte 'help start' para obtener más información. –
Mucho mejor que la respuesta aceptada –
En realidad, ¿por qué necesita 'start/w' en absoluto? Yo mismo creo que es necesario usar 'start/w' para bloquear el archivo por lotes hasta que finalice la aplicación GUI (como opuesta a una consola). Pero al probarlo ahora, veo que los archivos por lotes realmente esperan incluso para las aplicaciones GUI. He publicado la pregunta correspondiente: [¿Por qué la aplicación GUI bloquea un archivo por lotes?] (Http://stackoverflow.com/questions/19381082/why-gui-application-blocks-a-batch-file) –
me gusta la respuesta "START/W", aunque para mi situación me encontré con algo aún más básico. Mis procesos eran aplicaciones de consola. Y en mi ignorancia, pensé que necesitaría algo especial en la sintaxis de BAT para asegurarme de que el primero se completara antes de que comenzara el segundo. Sin embargo, BAT parece hacer una distinción entre aplicaciones de consola y aplicaciones de Windows, y las ejecuta de forma un poco diferente. El OP muestra que las aplicaciones de ventana se lanzarán como una llamada asincrónica desde BAT. Pero para las aplicaciones de consola, que se invocan de forma síncrona, dentro de la misma ventana de comando en que se ejecuta BAT.
Para mí, en realidad era mejor no usar "START/W", porque todo podía ejecutarse dentro de una ventana de comando . Lo molesto de "START/W" es que generará una nueva ventana de comandos para ejecutar la aplicación de la consola.
Con el interruptor/B se ejecutará en la misma ventana. – Uhlen
Ah, ya veo. ¿Pero entonces hay alguna diferencia entre llamar "My.exe" directamente, frente a "START/B My.exe"? Parece lo mismo. –
Esta es una versión actualizada de aphoria's Answer.
Sustituí PSLIST y PSEXEC con TASKKILL y TASKLIST`. Como parecen funcionar mejor, no pude conseguir que PSLIST se ejecute en Windows 7.
También reemplazado Duerme con TIMEOUT.
Esto era todo lo que necesitaba para ejecutar bien el script, y todas las adiciones fueron provistas por los tipos geniales que publicaron los comentarios.
Además, si hay un retraso antes de que comience el .exe, podría valer la pena insertar un tiempo de espera antes del ciclo:.
@ECHO OFF
TASKKILL NOTEPAD
START "" "C:\Program Files\Windows NT\Accessories\wordpad.exe"
:LOOP
tasklist | find /i "WORDPAD" >nul 2>&1
IF ERRORLEVEL 1 (
GOTO CONTINUE
) ELSE (
ECHO Wordpad is still running
Timeout /T 5 /Nobreak
GOTO LOOP
)
:CONTINUE
NOTEPAD
Excelente. Probado y funciona en Windows 7,8,10. – Damien
Esta no es una versión "actualizada" de mi respuesta. Es una copia de mi respuesta que simplemente reemplaza 'PSLIST' y' PSEXEC' con 'TASKKILL' y' TASKLIST', que enumeré como alternativas en mi respuesta. – aphoria
Gracias. La mejor respuesta si el proceso pasa a engendrar procesos adicionales ya que la/wait solution no funcionará. Simplemente use un código similar para los procesos adicionales para resolver tales situaciones. – Robert
call process1
call process2
en este caso el process2 no comenzará hasta proceso1 han terminado.
Debe leer la pregunta (y los comentarios) con más cuidado. En el primer comentario se explica por qué 'CALL' no es una solución general – jeb
- 1. Cómo esperar a que un proceso finalice C++
- 2. ¿Cómo NO esperar a que se complete un proceso en un script por lotes?
- 3. esperar hasta que un proceso termina
- 4. Ejecutar proceso y no esperar
- 5. ¿Cómo esperar a que el proceso termine de usar IO.popen?
- 6. Cómo evitar que el archivo de proceso por lotes (.bat) se cierre al ejecutar comandos?
- 7. archivo de proceso por lotes de Windows: ejecutar ejecutable en otro directorio
- 8. io.popen - ¿cómo esperar a que termine el proceso en Lua?
- 9. archivo de proceso por lotes de otros parámetros que pasan
- 10. archivo de proceso por lotes para esperar a que se complete una instalación antes de pasar a la siguiente línea
- 11. Ejecutar archivo por lotes tras otro archivo por lotes se completa
- 12. Esperar a que un determinado proceso (conociendo el "PID") final
- 13. arrastre a otro proceso
- 14. de archivo usado por otro proceso
- 15. archivo está siendo utilizado por otro proceso
- 16. Inicio del proceso asincrónico y espere a que finalice
- 17. Proceso por lotes todos los archivos en el directorio
- 18. ¿Cómo esperar a que se copie por completo un archivo?
- 19. Invocar EXE desde el archivo por lotes * sin * esperar
- 20. ¿Cómo obtener un archivo de proceso por lotes para manejar espacios en nombres de archivo?
- 21. C# File.Delete, archivo que está siendo utilizado por otro proceso
- 22. Cómo esperar a que finalice el comando del sistema
- 23. Cómo recorrer los archivos que coinciden con el comodín en el archivo de proceso por lotes
- 24. archivo de proceso por lotes: vaya al ciclo
- 25. Volver a asociar archivos de proceso por lotes con Cmd.exe
- 26. Archivo de proceso por lotes para ejecutar todos los archivos en una carpeta
- 27. ¿Cómo esperar en un script por lotes?
- 28. Ejecutando cadena variable como comando en el proceso por lotes
- 29. .NET - TextWriterTraceListener, el archivo está en uso por otro proceso
- 30. Esperando secuencias paralelas de proceso por lotes
@sarnold El problema es que Win32 es ... Win32. Algunos programas (como escribir) * separarán * del proceso principal, mientras que otros programas (como el bloc de notas) no lo harán. –
@pst: pensé que tenía que usar 'start' para obtener el destacamento ... Oh wow. Esto es horrible_. – sarnold
@sarnold Oops: el bloc de notas no se separa, escribe does. Es algo relacionado con el programa de escritura, no necesariamente Win32, aunque muchos programas de interfaz de usuario (no destinados a ser llamados desde un shell) parecen funcionar así. Estoy bastante seguro de que 'CreateProcess' está relacionado. –