每10秒执行一次批处理文件


24

我有一个批处理文件:

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

如何在Windows XP上每10秒执行这两个命令?


3
您可以使用Windows Scheduled Tasks将其降至每分钟一次。

Windows批处理有可能:请参阅下面的解决方案。唯一的问题是cpu的使用...
kokbira 2011年

Answers:


36

这需要10秒。延迟:

timeout /t 10

所以试试这个:

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

1
过去十年中制造的任何Windows版本(包括问题中指定的Windows XP)的正确答案。谢谢:-)
求助于2016年

它实际上等待-1-99 999秒(~~ 1day3,7h | windows7)/t-OR中指定的用于按任意键的数字-可以通过发送/NOBREAKparam 来关闭它:)
jave.web

19

试试这个:

: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命令将看不到任何输出。它确实像“睡眠”命令一样工作。


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

编辑:如评论中所述,SLEEP在常规安装中将不可用。您将需要诸如Windows 2003 Resource Kit之类的东西,或一些其他模拟它的技巧(Bruno提到的ping技巧),并且可以在此处找到进行操作的注释。


6
默认情况下不包括睡眠。您需要资源工具包或其他工具来获得此工具?
marcc

我到底需要什么?

不是吗 我可以发誓这是我可以指望的东西,但我想好像choice它可能不包含在标准中。我会进一步研究。

1
无需在Windows上安装其他任何东西即可“伪造”睡眠命令。以我的答案为例。


1

您可以使用forand 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命令更好?
RalfFriedl

公平地说,这是第一个显示如何不使用进行无限循环的答案goto
斯科特

0

作弊:

使用此命令将批处理暂停10秒钟

选择/ n / t:c,<10> / c:cc

现在,将其放在批处理中永无止境的循环中,瞧瞧!


1
或者,如果需要,可以下载资源工具包或编写一个简单的prog来睡眠10。但是,我的方法意味着您可以将其移动到另一台计算机上,而不必再次下载更多软件。

我不认为choiceXP和更高版本附带了它,或者至少在最近的任何安装中都没有看到它。

1
我正在这台笔记本电脑上运行香草Vista Home Premium,它工作正常。

Windows XP没有“选择”!
kokbira 2011年

0

安装Cygwin的这将使sleep并且cron提供给你(除其他事项外)。


2
对于他的要求过大!

-1

在下面,这是一个丑陋且美观的方法,它是Windows批处理文件-它花费大量的cpu时间执行任何操作,但它可以完成您想要的并且非常好。

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

另一种方法是执行一些循环序列,例如重复几次(对于(1,1,65535中的/ l %% i,它什么也没有设置= 0)),然后“校准”“多少次”,您必须重复测试以结果在10秒内,哈哈哈。但这是最丑陋的方式。
kokbira 2011年

您还可以创建一些Windows批处理以用作功能(一个用于分割时间,一个用于执行等待...),但是它将更加复杂...
kokbira 2011年

我认为,如果您从23:59:51到23:59:59使用它,将导致错误-在那种情况下,该批处理将永远等待...某些“如果是”将解决问题...
kokbira

如果要测试固定时间(而不是时间+10秒),则可以简单地执行“如果%time%geq 10:30进行结束”。解决方案变得复杂,因为总和...
kokbira 2011年

这真是太可怕了。首先,忙于等待。不必要地浪费CPU周期绝不是一个好主意(除非在嵌入式硬件上)。在午夜前后,这似乎也无法正常工作。
乔伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.