Faça algo a cada 10 segundos em lote

24

Eu tenho um arquivo em lotes:

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

Como posso executar esses dois comandos no Windows XP, a cada 10 segundos?

charlatão quixote
fonte
3
Você pode usar as Tarefas agendadas do Windows para reduzi-las uma vez por minuto.
é possível com o lote do Windows: veja minha solução abaixo. o único problema é o uso da CPU ...
kokbira

Respostas:

36

isso faz 10 segundos. demora:

timeout /t 10

então tente o seguinte:

 :loop
 arp -s 192.168.1.254 xx-xx-xx-xx-xx-xx
 ipconfig /flushdns
 timeout /t 10
 goto loop
Tony
fonte
1
A resposta certa para qualquer versão do Windows feita na última década (incluindo o Windows XP especificado na pergunta). Obrigado :-)
woot
Na verdade, ele aguarda -1 - 99 999 segundos (~~ 1 dia3,7h | windows7) - o número especificado em /tOR para pressionar qualquer tecla - que pode ser desativado enviando /NOBREAKparam :)
jave.web
19

Tente este:

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

O comando ping será executado por 10 segundos e toda a saída será redirecionada para o dispositivo NUL, o que significa que você não verá nenhuma saída do comando ping. Ele realmente funciona como um comando "dormir".

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

Editar: conforme mencionado nos comentários, SLEEPnão estará disponível em uma instalação normal. Você precisará de algo como o Windows 2003 Resource Kit ou algum outro truque para simulá-lo (o truque de ping que Bruno menciona), e as notas para fazer isso podem ser encontradas aqui .

Doug Kavendek
fonte
6
o sono não está incluído por padrão. Você precisa do kit de recursos ou algo para obter isso?
Marcc
Do que exatamente eu preciso?
Não é? Eu poderia jurar que era algo em que eu poderia contar, mas acho choiceque talvez não seja incluído por padrão. Vou investigar mais.
1
Não é necessário instalar mais nada no Windows para "falsificar" um comando de suspensão. Dê uma olhada na minha resposta para um exemplo.
1

A solução mais precisa executa ping no host inexistente uma vez e define o tempo limite

ping 1.0.0.0 -n 1 -w 10000> nul

Mas gera tráfego parasita

Mikhail Moskalev
fonte
1

Você pode usar o comando fore 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
)

Você pode ping -n [secs+1] localhost >nulesperar um certo tempo em segundos.

Hayz
fonte
1
Por que isso é melhor do que exatamente o mesmo comando ping sugerido em outra resposta?
RalfFriedl 21/02
Para ser justo, esta é a primeira resposta que mostra como fazer um loop infinito sem usar goto.
Scott
0

Enganação:

Use este comando para pausar o lote por 10 segundos

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

Agora, coloque-o em um loop sem fim no lote e pronto!

Dan McGrath
fonte
1
Ou, se desejar, baixe o kit de recursos ou escreva um programa simples para dormir 10. No entanto, meu método significa que você pode movê-lo para outra máquina sem precisar baixar mais software novamente.
Eu não acho que choiceveio com o XP e mais tarde, ou pelo menos não o vi em nenhuma instalação recente.
1
Estou executando o vanilla Vista Home Premium neste laptop e funciona bem.
não existe "escolha" para o windows xp !!!
Kokbira #
0

Instale o Cygwin que disponibilizará sleepe crondisponibilizará para você (entre outras coisas).

multidão
fonte
2
Excesso pelo que ele está pedindo!
-1

abaixo, é uma maneira feia e bonita, um arquivo em lotes do Windows - consome muito tempo da CPU para não fazer nada, mas faz o que você quer e é tão bom.

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
fonte
Outra maneira é fazer uma sequência de loop, por exemplo, repetir (para / l %% i in (1.1655535) não define nada = 0) algumas vezes e "calibrar" "quantas vezes" você precisa repetir o teste para resultar em 10 segundos, hahaha. mas é a maneira mais feia.
Kokbira #
você também pode criar algum lote do Windows para usar como funções (uma a tempo parcial, um para fazer a espera ...) mas será mais complexa ...
kokbira
Eu acho que causará um erro se você o estiver usando das 23:59:51 às 23:59:59 - nesse caso, o lote aguardará para sempre ... alguns "se" resolveriam o problema ...
kokbira
se você quiser testar por um tempo fixo (não um tempo + 10s), basta fazer "se% time% geq 10:30 goto end". a solução tornou-se complexo porque a soma ...
kokbira
É realmente horrível. Primeiro de tudo, ocupado esperando. desperdiçar ciclos de CPU desnecessariamente nunca é uma boa ideia (a menos que seja em hardware incorporado). Isso também parece não funcionar corretamente por volta da meia-noite.
Joey