Repita un programa en bucle

2

Estoy usando Windows 10 Professional. Quiero crear un archivo por lotes:

  1. que abre el navegador Firefox,
  2. navega a una página
  3. cierra el navegador después de un minuto.
  4. Repita los pasos del 1 al 3.

Descubrí el siguiente código hasta ahora para escribir en mi archivo por lotes:

@echo off
start "C:\Program Files\Mozilla Firefox\firefox.exe" "http://testmywebsiteloadspeed.com"
ping -n 1 -w 60 

Pero esto no está haciendo nada. ¿También cómo logro 3 y 4?

CuriousDev
fuente
¿Usar PowerShell es una opción? Es difícil cerrar la ventana del navegador usando solo CMD.
davidmneedham
2
Start usa el primer argumento entre comillas dobles como el título de la ventana - insertar un par vacío start "" "..."tercera uso taskkill /?cuarta inserción de una :labely una goto :labelal final.
LotPings
¿Por qué no utilizar un complemento que recarga automáticamente la página?
Attie
@LotPings Intenté según lo sugerido por usted y Worthwelle. Pero funcionó solo 4 veces. Luego dice "Firefox se cierra inesperadamente mientras se inicia. Esto puede ser causado por complementos. Puede resolverlo iniciando en Modo seguro". Deshabilité todos los complementos, sin embargo, el problema persiste.
CuriousDev
@Attie ¿Cuál?
CuriousDev

Respuestas:

5

Utilizando GOTO

Pruebe el siguiente lote:

@echo off
set loopCount=50
:loop
start "C:\Program Files\Mozilla Firefox\firefox.exe" "http://testmywebsiteloadspeed.com"
set /a loopCount=%loopCount%-1
if %loopCount%==0 GOTO:EOF
timeout /t 60
taskkill /im firefox.exe
timeout /t 5
GOTO :loop
  • :loopdefine un GOTOpunto
  • timeout /t 60 espera 60 segundos
  • taskkill /im firefox.exe matará el proceso de Firefox
  • GOTO :loop volverá a enrutar al comienzo del guión.

Nota: Esto eliminará todos los procesos en ejecución de Firefox. Creo que Firefox generalmente solo permite uno a la vez de todos modos.

Bucle finito utilizando GOTO

Para hacer esto para un número específico de iteraciones, puede usar set /aalgunas matemáticas en una variable loopCount.

@echo off
set loopCount=50
:loop
start "C:\Program Files\Mozilla Firefox\firefox.exe" "http://testmywebsiteloadspeed.com"
set /a loopCount=%loopCount%-1
if %loopCount%==0 GOTO:EOF
timeout /t 60
taskkill /im firefox.exe
timeout /t 5
GOTO :loop

La set /a loopCount=%loopCount%-1línea reducirá el valor de loopCount en uno cada vez que se ejecute el bucle. La if %loopCount%==0 GOTO:EOFlínea saldrá del script cuando llegue a 0.

GOTO:EOF significa "ir al final del archivo", que omitirá cualquier otro código en el archivo.

Utilizando FOR /l

Una solución alternativa sería usar un FORbucle con el /linterruptor, pero he tenido problemas con esto cuando uso bucles anidados, por lo que generalmente me limito a la GOTOopción de archivos Batch simples como este. Aún así, espero que esto ayude a alguien en el futuro.

@echo off
for /l %%x in (1, 1, 50) do (
    start "C:\Program Files\Mozilla Firefox\firefox.exe" "http://testmywebsiteloadspeed.com"
   set /a loopCount=%loopCount%-1
   if %loopCount%==0 GOTO:EOF
   timeout /t 60
   taskkill /im firefox.exe
   timeout /t 5
)

Para desglosar el FOR /lcomando:

  • El primer argumento es donde comienzas.
  • El segundo argumento es qué gran paso dar. (Esto no es relevante para su ejemplo particular ya que no utiliza el valor en absoluto).
  • El tercer argumento es cuándo parar.
Worthwelle
fuente
Esto funcionó pero solo por 4 veces. Luego dice "Firefox se cierra inesperadamente mientras se inicia. Esto puede ser causado por complementos. Puede resolverlo iniciando en Modo seguro". Deshabilité todos los complementos, sin embargo, el problema persiste.
CuriousDev
Ese es uno de los riesgos de obligar a los programas a cerrar por lotes. No pueden cerrar la forma en que están diseñados. He estado tratando de encontrar una forma de evitar eso durante años.
Worthwelle
1
Podría intentar quitar el /finterruptor de taskkill y agregar un segundo tiempo de espera. Esto podría permitir que Firefox se cierre más naturalmente. Hay más información aquí . He actualizado la respuesta en consecuencia.
Worthwelle
1
@CuriousDev También podría poner algo de lógica a prueba de fallas allí después de la tarea tasklist | findStr /i firefox.exey luego if %errorlevel% neq 0 (taskkill /im firefox.exe)o algo de esa naturaleza si ve surgir problemas en el futuro. Probablemente debería ir a otra etiqueta y seguir comprobando que firefox.exe se elimina de la memoria; de lo contrario, continúe eliminándolo antes de comenzar otra instancia.
Pimp Juice IT
1
Una última pregunta @Worthwelle. ¿Qué pasa si tengo que ejecutar este ciclo solo un número finito de veces? Decir 50 veces. ¿Cómo lo haría? Creo que será un bucle For In? ¿Puedes mostrarlo con un nuevo ejemplo?
CuriousDev