Lakukan sesuatu setiap 10 detik file batch

24

Saya punya file batch:

arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns

Bagaimana saya bisa melakukan dua perintah ini pada Windows XP, setiap 10 detik?

quack quixote
sumber
3
Anda dapat menggunakan Tugas Terjadwal Windows untuk menurunkannya menjadi satu menit sekali.
itu mungkin dengan batch Windows: lihat solusi saya di bawah ini. satu-satunya masalah adalah penggunaan cpu ...
kokbira

Jawaban:

36

ini membuat 10 detik. menunda:

timeout /t 10

jadi coba ini:

 :loop
 arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
 ipconfig /flushdns
 timeout /t 10
 goto loop
Tony
sumber
1
Jawaban yang tepat untuk semua versi Windows yang dibuat dalam dekade terakhir (termasuk Windows XP yang ditentukan dalam pertanyaan). Terima kasih :-)
mainkan
Sebenarnya menunggu -1 - 99 999 detik (~~ 1 hari3,7j | windows7) - angka yang ditentukan dalam /tATAU untuk menekan tombol apa saja - yang dapat dimatikan dengan mengirim /NOBREAKparam :)
jave.web
19

Coba yang ini:

:loop
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
ping localhost -n 11 > nul
goto loop

Perintah ping akan dieksekusi selama 10 detik, dan semua output akan dialihkan ke perangkat NUL, artinya Anda tidak akan melihat output dari perintah ping. Ini memang berfungsi seperti perintah "sleep".

Bruno Reis
sumber
11
:top
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
sleep 10
goto top

Sunting: Seperti disebutkan dalam komentar, SLEEPtidak akan tersedia dalam pemasangan normal. Anda akan memerlukan sesuatu seperti Windows 2003 Resource Kit, atau beberapa trik lain untuk mensimulasikannya (ping trick Bruno menyebutkan), dan catatan untuk melakukannya dapat ditemukan di sini .

Doug Kavendek
sumber
6
tidur tidak termasuk secara default. Anda memerlukan kit sumber daya atau sesuatu untuk mendapatkannya?
marcc
Apa yang sebenarnya saya butuhkan?
Bukan? Aku bisa bersumpah itu adalah sesuatu yang bisa kupercayai, tapi kurasa choiceitu mungkin tidak termasuk dalam standar. Saya akan melihat lebih dalam.
1
Tidak perlu menginstal apa pun di windows untuk "memalsukan" perintah tidur. Lihatlah jawaban saya sebagai contoh.
1

Solusi yang lebih tepat ping host yang tidak ada satu kali dan mengatur batas waktu

ping 1.0.0.0 -n 1 -w 10000> nul

Tapi itu menghasilkan traffic parasit

Mikhail Moskalev
sumber
1

Anda dapat menggunakan perintah fordan ping:

@echo off
for /l %%a in (0,0,0) do (
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
ping -n 11 localhost >nul
)

Anda dapat menggunakan ping -n [secs+1] localhost >nuluntuk menunggu sejumlah waktu dalam hitungan detik.

Hayz
sumber
1
Mengapa ini lebih baik daripada perintah ping yang sama seperti yang disarankan dalam jawaban lain?
RalfFriedl
Agar adil, ini adalah jawaban pertama yang menunjukkan bagaimana melakukan infinite loop tanpa menggunakan goto.
Scott
0

Curang:

Gunakan perintah ini untuk menjeda kumpulan selama 10 detik

pilihan / n / t: c, <10> / c: cc

Sekarang, letakkan di loop yang tidak pernah berakhir di batch dan voilà!

Dan McGrath
sumber
1
Atau, jika Anda mau, unduh kit sumber daya atau tulis prog sederhana untuk tidur 10. Namun metode saya, artinya Anda dapat memindahkannya ke komputer lain tanpa harus mengunduh lebih banyak perangkat lunak lagi.
Saya tidak berpikir choicedatang dengan XP dan kemudian, atau setidaknya saya belum melihatnya di instalasi baru-baru ini.
1
Saya menjalankan vanilla Vista Home Premium di laptop ini dan berfungsi dengan baik.
tidak ada "pilihan" untuk windows xp !!!
kokbira
0

Instal Cygwin yang akan membuat sleepdan crontersedia untuk Anda (antara lain).

massa
sumber
2
Berlebihan untuk apa yang dia minta!
-1

di bawah ini, ini merupakan cara yang jelek dan indah, file batch Windows - ia menghabiskan banyak waktu cpu untuk tidak melakukan apa-apa, tetapi ia melakukan apa yang Anda inginkan dan sangat baik.

SETLOCAL EnableDelayedExpansion

::in seconds
set time2stop=10

:loop1
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns

for /f "tokens=1,2* delims=:" %%i in ("!time!") do (
  set hour1=%%i
  set min1=%%j
  set sec1=%%k
)

for /f "tokens=1* delims=," %%i in ("!sec1!") do (
  set isec1=%%i
)

:loop2

for /f "tokens=1,2* delims=:" %%i in ("!time!") do (
  set hour2=%%i
  set min2=%%j
  set sec2=%%k
)

for /f "tokens=1* delims=," %%i in ("!sec2!") do (
  set isec2=%%i
)

set /a delta=3600*(!hour2!-!hour1!)+60*(!min2!-!min1!)+(!isec2!-!isec1!)
if !delta! geq !time2stop! goto end2

goto loop2

:end2

@echo on

goto loop1
kokbira
sumber
Cara lain adalah dengan melakukan beberapa urutan loop, misalnya mengulangi (untuk / l %% i in (1,1,65535) jangan atur apa-apa = 0) beberapa kali dan "kalibrasi" "berapa kali" Anda harus mengulang pengujian untuk hasil dalam 10 detik, hahaha. tapi itu cara yang paling jelek.
kokbira
Anda juga dapat membuat beberapa batch Windows untuk digunakan sebagai fungsi (satu untuk membagi waktu, satu untuk melakukan menunggu ...) tetapi akan lebih kompleks ...
kokbira
Saya pikir itu akan menyebabkan bug jika Anda menggunakannya dari 23:59:51 hingga 23:59:59 - dalam hal ini, batch akan menunggu selamanya ... beberapa "jika" akan menyelesaikan masalah ...
kokbira
jika Anda ingin menguji waktu tetap (bukan waktu + 10dtk), Anda cukup melakukan "jika% waktu% geq 10:30 lakukan goto end". solusinya menjadi kompleks karena jumlahnya ...
kokbira
Sebenarnya mengerikan. Pertama-tama, sibuk menunggu. membuang-buang siklus CPU yang tidak perlu tidak pernah merupakan ide yang baik (kecuali pada perangkat keras tertanam). Ini juga tampaknya tidak berfungsi dengan benar sekitar tengah malam.
Joey