私はバッチファイルを持っています:
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
Windows XPでこれらの2つのコマンドを10秒ごとに実行するにはどうすればよいですか?
これは10秒になります。ディレイ:
timeout /t 10
だからこれを試してください:
:loop
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
timeout /t 10
goto loop
これを試してください:
: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コマンドからの出力は表示されません。実際、「スリープ」コマンドと同じように機能します。
:top
arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
ipconfig /flushdns
sleep 10
goto top
編集:コメントで述べたように、SLEEP
は通常のインストールでは使用できません。 Windows 2003リソースキット、またはそれをシミュレートするためのその他のトリック(ブルーノが言及するpingトリック)が必要であり、そのためのメモは here にあります。
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回pingし、タイムアウトを設定します
ping 1.0.0.0 -n 1 -w 10000> nul
しかし、それは寄生虫のトラフィックを生成します
チート:
このコマンドを使用して、バッチを10秒間一時停止します
選択/ n/t:c、<10>/c:cc
今度は、それをバッチの終わりのないループに入れて、ボイラ!
Cygwin をインストールすると、(特に)sleep
とcron
が利用可能になります。
以前のすべての回答に欠陥があります。各ループに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