Faites quelque chose toutes les 10 secondes de fichier batch


24

J'ai un fichier batch:

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

Comment puis-je exécuter ces deux commandes sous Windows XP, toutes les 10 secondes?


3
Vous pouvez utiliser les tâches planifiées de Windows pour le réduire à une fois par minute.

c'est possible avec Windows batch: voir ma solution ci-dessous. le seul problème est l'utilisation du processeur ...
kokbira

Réponses:


36

cela fait un 10 sec. retard:

timeout /t 10

alors essayez ceci:

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

1
La bonne réponse pour toute version de Windows fabriquée au cours de la dernière décennie (y compris Windows XP spécifié dans la question). Merci :-)
woot le

Il attend réellement -1 - 99 999 secondes (~~ 1day3,7h | windows7) - le nombre spécifié dans /tOR pour appuyer sur n'importe quelle touche - qui peut être désactivé en envoyant /NOBREAKparam :)
jave.web

19

Essaye celui-là:

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

La commande ping s'exécutera pendant 10 secondes et toute la sortie sera redirigée vers le périphérique NUL, ce qui signifie que vous ne verrez aucune sortie de la commande ping. Il fonctionne en effet comme le ferait une commande "sleep".


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

Edit: Comme mentionné dans les commentaires, SLEEPne sera pas disponible dans une installation normale. Vous aurez besoin de quelque chose comme le Kit de ressources Windows 2003, ou d'une autre astuce pour le simuler (l'astuce ping mentionnée par Bruno), et des notes pour le faire peuvent être trouvées ici .


6
le sommeil n'est pas inclus par défaut. Vous avez besoin du kit de ressources ou de quelque chose pour l'obtenir?
marcc

De quoi ai-je besoin exactement?

Non? J'aurais pu jurer que c'était quelque chose sur quoi je pouvais compter, mais je suppose que choicecela pourrait ne pas être inclus par la norme. J'examinerai plus en détail.

1
Il n'est pas nécessaire d'installer quoi que ce soit d'autre sur Windows pour "simuler" une commande sleep. Jetez un oeil à ma réponse pour un exemple.

1

Solution plus précise ping une fois sur l'hôte inexistant et définit le délai d'expiration

ping 1.0.0.0 -n 1 -w 10000> nul

Mais cela génère du trafic parasite


1

Vous pouvez utiliser la commande foret 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
)

Vous pouvez utiliser ping -n [secs+1] localhost >nulpour attendre un certain temps en secondes.


1
Pourquoi est-ce mieux que exactement la même commande ping suggérée dans une autre réponse?
RalfFriedl

Pour être juste, c'est la première réponse qui montre comment faire une boucle infinie sans utiliser goto.
Scott

0

Tricher:

Utilisez cette commande pour suspendre le lot pendant 10 secondes

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

Maintenant, placez-le dans une boucle sans fin dans le lot et voilà!


1
Ou, si vous le souhaitez, téléchargez le kit de ressources ou écrivez un programme simple pour dormir 10. Ma méthode, cependant, signifie que vous pouvez le déplacer vers une autre machine sans avoir à télécharger à nouveau plus de logiciels.

Je ne pensais pas que choicec'était venu avec XP et plus tard, ou du moins je ne l'ai pas vu sur des installations récentes.

1
J'utilise vanilla Vista Home Premium sur cet ordinateur portable et cela fonctionne très bien.

il n'y a pas de "choix" pour windows xp !!!
kokbira

0

Installer Cygwin qui fera sleepet cronà votre disposition (entre autres).


2
Trop pour ce qu'il demande!

-1

ci-dessous, c'est à la fois une méthode laide et belle, un fichier batch Windows - il consomme beaucoup de temps processeur pour ne rien faire, mais il fait ce que vous voulez et est tellement agréable.

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

une autre façon est de faire une séquence de boucle, par exemple en répétant (pour / l %% i dans (1,1,65535) ne définissez rien = 0) quelques fois et en "calibrant" "combien de fois" vous devez répéter le test pour résultat en 10 secondes, hahaha. mais c'est la façon la plus laide.
kokbira

vous pouvez également créer un lot Windows à utiliser comme fonctions (un pour partager le temps, un pour faire l'attente ...) mais ce sera plus complexe ...
kokbira

Je pense que cela causera un bogue si vous l'utilisez de 23:59:51 à 23:59:59 - dans ce cas, le lot attendra pour toujours ... certains "si" résoudraient le problème ...
kokbira

si vous voulez tester pendant un temps fixe (pas un temps + 10sec) vous pouvez simplement faire "si% time% geq 10:30 do goto end". la solution est devenue complexe parce que la somme ...
kokbira

C'est vraiment horrible. Tout d'abord, attente occupée. gaspiller inutilement les cycles CPU n'est jamais une bonne idée (sauf sur du matériel embarqué). Cela ne semble pas non plus fonctionner correctement vers minuit.
Joey
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.