ทำซ้ำโปรแกรมในลูป


2

ฉันใช้ Windows 10 Professional ฉันต้องการสร้างไฟล์แบตช์:

  1. ที่เปิดเบราว์เซอร์ Firefox
  2. นำทางไปยังหน้า
  3. ปิดเบราว์เซอร์หลังจากหนึ่งนาที
  4. ทำซ้ำขั้นตอนที่ 1 ถึง 3

ฉันคิดว่ารหัสต่อไปนี้เพื่อเขียนในชุดไฟล์ของฉัน:

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

แต่นี่ไม่ได้ทำอะไรเลย ฉันจะทำ 3 และ 4 ได้อย่างไร


กำลังใช้ตัวเลือก PowerShell หรือไม่ เป็นการยากที่จะปิดหน้าต่างเบราว์เซอร์ด้วย CMD เท่านั้น
davidmneedham

2
เริ่มใช้อาร์กิวเมนต์แรกในเครื่องหมายคำพูดคู่เป็นชื่อหน้าต่าง - ใส่คู่ที่ว่างเปล่าstart "" "..."3 ใช้ที่taskkill /?4 แทรก a :labelและ a goto :labelที่ท้าย
LotPings

ทำไมไม่ใช้ปลั๊กอินที่โหลดหน้าซ้ำอัตโนมัติ
Attie

@LotPings ฉันลองตามที่คุณและ Worthwelle แนะนำ แต่ใช้งานได้ 4 ครั้งเท่านั้น จากนั้นมีข้อความแจ้งว่า "firefox ปิดโดยไม่คาดคิดในขณะที่เริ่มต้นซึ่งอาจเกิดจากส่วนเสริมคุณสามารถแก้ไขได้โดยเริ่มต้นใน Safe Mode" ฉันปิดใช้งานแอดออนทั้งหมดแล้วแต่ปัญหายังคงมีอยู่
CuriousDev

@Attie อันไหน?
CuriousDev

คำตอบ:


5

การใช้ GOTO

ลองชุดต่อไปนี้:

@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
  • :loopกำหนดGOTOจุด
  • timeout /t 60 รอ 60 วินาที
  • taskkill /im firefox.exe จะฆ่ากระบวนการ Firefox
  • GOTO :loop จะเปลี่ยนเส้นทางกลับไปที่จุดเริ่มต้นของสคริปต์

หมายเหตุ:นี่จะฆ่ากระบวนการ Firefox ที่กำลังทำงานอยู่ทั้งหมด ฉันคิดว่า Firefox โดยทั่วไปจะอนุญาตให้ทำได้ทีละครั้งเท่านั้น

ใช้ไฟไนต์ลูป GOTO

ในการทำเช่นนี้สำหรับการทำซ้ำตามจำนวนที่ระบุคุณสามารถใช้set /aในการทำคณิตศาสตร์บางอย่างในตัวแปร 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

set /a loopCount=%loopCount%-1สายจะลดค่าของ loopCount โดยหนึ่งในแต่ละครั้งที่วงวิ่ง if %loopCount%==0 GOTO:EOFสายจะออกจากสคริปต์เมื่อมันถึง 0

GOTO:EOF หมายถึง "ไปที่จุดสิ้นสุดของไฟล์" ซึ่งจะข้ามรหัสอื่น ๆ ในไฟล์

การใช้ FOR /l

ทางเลือกอื่นคือใช้FORลูปกับ/lสวิตช์ แต่ฉันมีปัญหาในการใช้ลูปซ้อนกันดังนั้นฉันมักจะติดกับGOTOตัวเลือกของไฟล์แบทช์ธรรมดาเช่นนี้ ถึงกระนั้นฉันหวังว่าสิ่งนี้จะช่วยให้ใครบางคนในอนาคต

@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
)

หากต้องการแยกFOR /lคำสั่ง:

  • อาร์กิวเมนต์แรกคือตำแหน่งที่คุณเริ่ม
  • อาร์กิวเมนต์ที่สองคือขั้นตอนใหญ่เพียงใด (สิ่งนี้ไม่เกี่ยวข้องกับตัวอย่างเฉพาะของคุณเนื่องจากคุณไม่ได้ใช้ค่าเลย)
  • อาร์กิวเมนต์ที่สามคือเมื่อหยุด

มันใช้งานได้ แต่แค่ 4 ครั้งเท่านั้น จากนั้นมีข้อความแจ้งว่า "firefox ปิดโดยไม่คาดคิดในขณะที่เริ่มต้นซึ่งอาจเกิดจากส่วนเสริมคุณสามารถแก้ไขได้โดยเริ่มต้นใน Safe Mode" ฉันปิดใช้งานแอดออนทั้งหมดแล้วแต่ปัญหายังคงมีอยู่
CuriousDev

นั่นเป็นหนึ่งในความเสี่ยงของการบังคับให้โปรแกรมปิดผ่านแบทช์ พวกเขาไม่สามารถปิดวิธีการออกแบบ ฉันพยายามหาวิธีที่เหมาะสมมาหลายปีแล้ว
Worthwelle

1
คุณสามารถลองใช้/fสวิตช์บน taskkill และเพิ่มการหมดเวลาครั้งที่สอง นี่อาจทำให้ Firefox ปิดได้ตามธรรมชาติ มีบางข้อมูลเพิ่มเติมเป็นที่นี่ ฉันได้อัพเดตคำตอบแล้ว
Worthwelle

1
@CrownDev คุณสามารถใส่ตรรกะความปลอดภัยที่ล้มเหลวในนั้นหลังจาก taskkill tasklist | findStr /i firefox.exeแล้วif %errorlevel% neq 0 (taskkill /im firefox.exe)หรือสิ่งที่ลักษณะที่คุณควรเห็นปัญหาที่เกิดขึ้นในอนาคต ฉันอาจจะให้มันไปที่ป้ายกำกับอื่นและตรวจสอบว่า firefox.exe ถูกฆ่าจากหน่วยความจำอย่างอื่นให้ฆ่ามันก่อนที่จะเริ่มอินสแตนซ์อื่น
Pimp Juice IT

1
คำถามสุดท้ายหนึ่ง @Worthwelle จะทำอย่างไรถ้าฉันต้องเรียกใช้ลูปนี้ในจำนวนครั้งที่ จำกัด เท่านั้น พูด 50 ครั้ง ฉันจะทำอย่างไร ฉันเชื่อว่ามันจะเป็นวงในสำหรับ? คุณช่วยแสดงด้วยตัวอย่างใหม่ได้ไหม
CuriousDev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.