web-dev-qa-db-ja.com

10秒ごとにバッチファイルを実行する

私はバッチファイルを持っています:

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

Windows XPでこれらの2つのコマンドを10秒ごとに実行するにはどうすればよいですか?

25
steven

これは10秒になります。ディレイ:

timeout /t 10

だからこれを試してください:

 :loop
 arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
 ipconfig /flushdns
 timeout /t 10
 goto loop
37
Tony

これを試してください:

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

Pingコマンドは10秒間実行され、すべての出力はNULデバイスにリダイレクトされます。つまり、pingコマンドからの出力は表示されません。実際、「スリープ」コマンドと同じように機能します。

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

編集:コメントで述べたように、SLEEPは通常のインストールでは使用できません。 Windows 2003リソースキット、またはそれをシミュレートするためのその他のトリック(ブルーノが言及するpingトリック)が必要であり、そのためのメモは here にあります。

11
Doug Kavendek

forおよび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
)

ping -n [secs+1] localhost >nulを使用して、秒単位で特定の時間待機することができます。

1
Hayz

より正確なソリューションは、存在しないホストに1回pingし、タイムアウトを設定します

ping 1.0.0.0 -n 1 -w 10000> nul

しかし、それは寄生虫のトラフィックを生成します

1

チート:

このコマンドを使用して、バッチを10秒間一時停止します

選択/ n/t:c、<10>/c:cc

今度は、それをバッチの終わりのないループに入れて、ボイラ!

0
Dan McGrath

Cygwin をインストールすると、(特に)sleepcronが利用可能になります。

0
mob

以前のすべての回答に欠陥があります。各ループに10秒かかるのではなく、各ループに10秒と必要なワークロードの実行時間を加えます。正しい解決策では、各ループは、ループのワークロードの実行が完了してから現在の時間を望ましいループの終了時間から差し引くことによって、停止するまでの秒数を計算する必要があります。各ループの開始時に、希望のループ期間(10秒など)を前の希望ループ終了時間に追加する必要があります。 (最初のループが始まる前の初期化中に、Desired Loop Endtimeを現在の時間に設定します。)このスキームにより、すべてのNについて、Nループを実行する合計時間は、希望する合計時間の1秒以内になります(N x DesiredLoopDuration )。

一時停止にTIMEOUTコマンドを使用して、CPUのオーバーヘッドを最小限に抑えることができます。

各ループをテストする必要があるのは、真夜中のロールオーバー(この場合86400秒を希望ループの終了時間から差し引く必要がある)と夏時間への変更(この場合は3600秒を希望ループの終了時間に加算または差し引く必要がある)です。 。

ループの継続時間が1時間未満であると想定できる場合、午前0時のロールオーバーと夏時間の変更のチェックは簡単に実装できます。 1時間を超える望ましいループ継続時間を可能にする一般的なソリューションは、それぞれが1時間未満の複数の内部ループに望ましい継続時間を単に分割できます。 (各外部ループで1回ワークロードを実行し、正しい秒数とチェックを一時停止するためにのみ内部ループを使用します。)上記で、各ループの開始時に、希望のループ期間をEndtimeに追加する必要があると記述しました。一般的な解決策は、各内部ループの開始時に、目的の内部ループ期間をEndtimeに追加する必要があることを意味します。

これが私の.batスクリプトです:

@echo off
set /A "DesiredSeconds=%1"
setlocal EnableDelayedExpansion

rem  Since DesiredSeconds might be very long, split the loop into 
rem    pieces each less than an hour to simplify Daylight Savings tests.
set /A "MaxSecondsPerLoop=1800"
rem  For debugging, use a small maxloop duration:
rem set /A "MaxSecondsPerLoop=35"
rem  There will be zero or more inner loops of maxsecondsperloop duration,
rem     plus a final inner loop that completes the outer loop duration.
set /A "NumberOfLoops=1+(DesiredSeconds/MaxSecondsPerLoop)"
set /A "FinalLoopSeconds=(DesiredSeconds%%MaxSecondsPerLoop)"

rem  Initialize Endtime to current time, in seconds after midnight.
rem  Note that HH may have a leading blank space, while MM and SS may have
rem     a leading zero (octal confusion).  If HH can have a leading zero
rem     in your locale, you'll need to modify this code accordingly,
rem     and the code in the inner loop below too.
for /F "tokens=1-3 delims=:." %%a in ("%time%") do (
   set /A "EndTime=(3600*%%a)+(60*(1%%b-100))+(1%%c-100)"
)

:loop
call :workload %2 %3 %4 %5 %6 %7 %8 %9

rem  Now wait long enough so the total loop duration will be as desired.
for /L %%G in (1,1,%NumberOfLoops%) do (
   rem  Set Endtime to the desired end of the inner loop:
   if %%G LSS !NumberOfLoops! (
      set /A "EndTime+=MaxSecondsPerLoop"
   ) else (
      set /A "EndTime+=FinalLoopSeconds"
   )

   rem  To calculate the number of seconds to pause, and to check for 
   rem     midnight rollover and change to/from Daylight Savings Time, 
   rem     we need to know the current time, as seconds after midnight.
   for /F "tokens=1-3 delims=:." %%a in ("!time!") do (
      set /A "CurrentTime=(3600*%%a)+(60*(1%%b-100))+(1%%c-100)"
   )

   rem  We passed midnight if endtime is MUCH greater than currenttime
   rem     so in that case subtract 24 hours from endtime.
   set /A "TimePlus12Hrs=CurrentTime+43200"
   if !EndTime! GTR !TimePlus12Hrs!  set /A "EndTime-=86400"

   rem  A change to Daylight Savings Time occurred if endtime < currenttime
   rem     so in that case add an hour to endtime.
   if !EndTime! LSS !CurrentTime! set /A "EndTime+=3600"

   rem  A change to Standard Time occurred if endtime>currenttime+3600
   rem     so in that case subtract an hour from endtime.
   set /A "TimePlus1Hr=CurrentTime+3600"
   if !EndTime! GTR !TimePlus1Hr! set /A "EndTime-=3600"

   set /A "SecsToWait=EndTime-CurrentTime"
   echo %time%  Pausing !SecsToWait! seconds to complete the loop...
   TIMEOUT /t !SecsToWait! /NOBREAK >nul
)
goto :loop

:workload
rem For testing, simulate a workload that lasts for
rem    a variable length of time from 0 to 9 seconds:
for /F "tokens=1-4 delims=:." %%a in ("%time%") do (
   set /A "WorkSecs=(1%%d-100)%%10"
)
echo %time%  Simulating workload for approximately !WorkSecs! seconds...
TIMEOUT /t !WorkSecs! /NOBREAK >nul
exit /B

endlocal
0
Dolores Stevens