Делайте что-нибудь каждые 10 секунд командный файл


24

У меня есть командный файл:

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

Как я могу выполнять эти две команды в Windows XP каждые 10 секунд?


3
Вы можете использовать запланированные задачи Windows, чтобы сократить время до одного раза в минуту.

это возможно с помощью пакета Windows: см. мое решение ниже. единственная проблема - использование процессора ...
kokbira

Ответы:


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, указанную в вопросе). Спасибо :-)
woot

На самом деле он ждет -1 - 99 999 секунд (~~ 1day3,7h | windows7) - число, указанное в /tOR для нажатия любой клавиши, - которое можно отключить, отправив /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 или какой-то другой трюк для его симуляции (трюк для пинга, упоминает Бруно), и заметки для этого можно найти здесь .


6
сон не включен по умолчанию. Вам нужен набор ресурсов или что-то, чтобы получить это?
Marcc

Что именно мне нужно?

Не так ли? Я мог бы поклясться, что это было то, на что я мог рассчитывать, но я думаю, что choiceэто не может быть включено стандартом. Я посмотрю на это больше.

1
Нет необходимости устанавливать что-либо еще в Windows, чтобы «подделать» команду сна. Посмотрите на мой ответ для примера.

1

Более точное решение пингует несуществующий хост один раз и устанавливает таймаут

ping 1.0.0.0 -n 1 -w 10000> ноль

Но это генерирует паразитный трафик


1

Вы можете использовать команду 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, предложенная в другом ответе?
Ральф Фридл

Чтобы быть справедливым, это первый ответ, который показывает, как сделать бесконечный цикл без использования goto.
Скотт

0

Чит:

Используйте эту команду, чтобы приостановить пакет на 10 секунд

выбор / н / т: с, <10> / с: куб.

Теперь поместите его в бесконечный цикл в пакете и вуаля!


1
Или, если хотите, загрузите набор ресурсов или напишите простую прогу в спящем режиме 10. Однако мой метод будет означать, что вы можете переместить его на другой компьютер без необходимости загружать больше программного обеспечения снова.

Я не думал, что choiceпришел с XP и позже, или, по крайней мере, я не видел его в последних установках.

1
Я использую Vanilla Vista Home Premium на этом ноутбуке, и он работает нормально.

нет "выбора" для windows xp !!!
Кокбира

0

Установите Cygwin, который сделает sleepи cronдоступен для вас (среди прочего).


2
Избыток за то, что он просит!

-1

ниже, это уродливый и красивый способ, пакетный файл Windows - он тратит много времени процессора, чтобы ничего не делать, но он делает то, что вы хотите, и это очень приятно.

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

Другой способ - выполнить некоторую последовательность циклов, например, повторить (для / l %% i в (1,165535) ничего не устанавливать = 0) несколько раз и «откалибровать» «сколько раз» нужно повторить тестирование, чтобы результат за 10 секунд, хахаха. но это самый уродливый путь.
Кокбира

Вы также можете создать несколько пакетов Windows для использования в качестве функций (один для разделения времени, другой для ожидания ...), но это будет более сложным ...
kokbira

Я думаю, что это вызовет ошибку, если вы используете его с 23:59:51 до 23:59:59 - в этом случае пакет будет ждать вечно ... некоторое "если" решит проблему ...
Кокбира

если вы хотите выполнить тестирование в течение фиксированного времени (а не времени + 10 секунд), вы можете просто сделать «if% time% geq 10:30 do goto end». решение стало сложным, потому что сумма ...
Кокбира

Это на самом деле ужасно. Прежде всего, занят ожидания. излишняя потеря циклов ЦП никогда не является хорошей идеей (если только на встроенном оборудовании). Это также, кажется, не работает правильно около полуночи.
Джои
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.