1 (изменено: MegaScrew, 2012-08-03 14:34:50)

Тема: CMD/BAT: sleep штатными средствами cmd

задержка от 1 до 60 секунд

call :sleep 10

:sleep
setlocal
    if %time:~5,2% EQU :0 (set /a ftime=%time:~7,-3%+%1 ) else ( set /a ftime=%time:~6,-3%+%1 )
    if %ftime% GEQ 60 set /a ftime-=60
    :loop
     if %time:~5,2% EQU :0 (set /a ctime=%time:~7,-3% ) else ( set /a ctime=%time:~6,-3% )
        if /i %ftime% NEQ %ctime% goto :loop
endlocal
exit /b 0

2

Re: CMD/BAT: sleep штатными средствами cmd

Можно проще:

call :Sleep 60
exit /b

:Sleep
set /a iTime = %~1 + 1
ping.exe -n %iTime% 127.0.0.1
exit /b

3

Re: CMD/BAT: sleep штатными средствами cmd

Согласен, можно, но не всем этот способ подходит.

4

Re: CMD/BAT: sleep штатными средствами cmd

Поясните, коллега.

5

Re: CMD/BAT: sleep штатными средствами cmd

не всегда есть ип

Я конечно далек от мысли... (с)

6

Re: CMD/BAT: sleep штатными средствами cmd

+ а в сабже крайне ужасный метод, на другом форуме посоветовал бы автору убить себя )

Я конечно далек от мысли... (с)

7

Re: CMD/BAT: sleep штатными средствами cmd

Я так же согласен, что делать пауза при помощи пинга - ужасный метод. Самое плохое, что в большинстве случаев он работает. Но иногда такую паузу может выдать, что и близко к нужной не лежит.

8

Re: CMD/BAT: sleep штатными средствами cmd

Можно делать задержки с помощью JScript по "технологии" bat+jscript: два в одном

( 2 * b ) || ! ( 2 * b )

9

Re: CMD/BAT: sleep штатными средствами cmd

Smitis пишет:

Но иногда такую паузу может выдать, что и близко к нужной не лежит.

Причины, пример?

10

Re: CMD/BAT: sleep штатными средствами cmd

alexii пишет:
Smitis пишет:

Но иногда такую паузу может выдать, что и близко к нужной не лежит.

Причины, пример?

пример, на слабом PC выполняющим роль сервака с обычной сетевухой, загруженного разными задачами.
Наблюдал случаи когда инфа от пинга поступает спустя 10 - 15 секунд

11

Re: CMD/BAT: sleep штатными средствами cmd

от пинга чего ? и зачем инфа ?

Я конечно далек от мысли... (с)

12

Re: CMD/BAT: sleep штатными средствами cmd

у меня есть старый ноут целерон 1200 озу 384 метра на котором стоит winxp pro sp3
при пинге 127.0.0.1 первая строчка появиться через 10 - 15 секунд остальные каждые 2 - 3 секунды (сидел замерял время) именно по этой причине стал искать другие варианты sleep.
Другой вариант нашел и выложил тут, кому надо те возьмут.

13 (изменено: greg zakharov, 2012-08-06 17:14:09)

Re: CMD/BAT: sleep штатными средствами cmd

Smitis пишет:

Я так же согласен, что делать пауза при помощи пинга - ужасный метод.

Так в чем же дело, используйте sleep.exe из набора Windows Server 2003 Resource Kit, забросив его в системную папку. Хотя если речь о стандартных средствах, то соглашусь с господином Rumata.

14 (изменено: smaharbA, 2012-08-06 18:04:30)

Re: CMD/BAT: sleep штатными средствами cmd

cmd /v:on /q /c "echo !time! & ping -n 1 -w 2000 0.0.0.1 > nul & echo !time!"
Я конечно далек от мысли... (с)

15

Re: CMD/BAT: sleep штатными средствами cmd

MegaScrew
+40% к загрузке процессора (AMD A4-3310MX 2100 MHz, Win7Pro SP1) ?
И это для "старого ноута" или "слабого PC, выполняющего роль сервака" ??

16

Re: CMD/BAT: sleep штатными средствами cmd

Serge Yolkin, предложите альтернативу без ping-а и sleep.exe из Resource Kit.

ИМХО:
Всегда в инструментах специалиста есть молоточек, молоток и кувалда и каждый специалист выбирает сам что ему использовать.

Если есть предложения по оптимизации и упрощению кода давайте обсудим. Все остальное вода.

17

Re: CMD/BAT: sleep штатными средствами cmd

Test.cmd

Start /b /wait 5s.js

5s.js

WScript.Sleep(5000);

18

Re: CMD/BAT: sleep штатными средствами cmd

в авторском коде преимущество с другими - нет старта внешнего приложения, но есть но - цикл не передает управление системе и сам жрет

Я конечно далек от мысли... (с)

19

Re: CMD/BAT: sleep штатными средствами cmd

Господа! а что вы именно разумеете под штатными средствами? Учитывая, что .NET Framework ныне стал необходимостью для большинства пользователей, можно использовать его возможности.

::///////////////////////////////////////////////////////////////////////////////////////////////
::
:: (C) 2012 forum.script-coding.com (written by greg zakharov)
::
::///////////////////////////////////////////////////////////////////////////////////////////////

@echo off
 setlocal
  ::
  ::source for a sleep.exe
  ::
  %1 > "%~dp0src.cs" (
   echo using System;
   echo using System.Threading;
   echo using System.Reflection;
   echo.
   echo [assembly: AssemblyVersion^(^"2.0.0.0^"^)]
   echo.
   echo class Program
   echo {
   echo   static void Main^(string[] args^)
   echo   {
   echo     if ^(args.Length == 1^)
   echo     {
   echo       int tik;
   echo       bool test = int.TryParse^(args[0], out tik^);
   echo.
   echo       if ^(test == false^)
   echo         Console.WriteLine^(^"Error has been occured. Probably, you specified not a number.^"^);
   echo       else
   echo         Thread.CurrentThread.Join^(tik^);
   echo     }
   echo   }
   echo }
  )
  ::
  ::getting .NET Framework path for compilation
  ::
  set key=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  set raw="%key%\%%i"

  for /f "tokens=7 delims=\" %%i in ('reg query %key% ^| findstr ".NET"') do (
    for /f "skip=4 tokens=3" %%j in ('reg query %raw% /v InstallLocation') do (
      set path=%path%;%%j
    )
  )
  ::
  ::compiling
  ::
  csc.exe /nologo /t:exe /out:"%~dp0sleep.exe" /r:System.dll "%~dp0src.cs"
  ::
  ::test assembly - sleep 10 sec.
  ::
  echo Right, this is only test! Standby...
  "%~dp0sleep.exe" 10000
  echo Test is OK. Terminating sleep.exe and its source...
  del /f /q "%~dp0sleep.exe" "%~dp0src.cs"
  echo All done...
 endlocal
exit /b

Может, подход несколько порочный, но у него есть один плюс - нет назгрузки на ЦП.

20

Re: CMD/BAT: sleep штатными средствами cmd

так можно и дебагом не создавая файла

Я конечно далек от мысли... (с)

21

Re: CMD/BAT: sleep штатными средствами cmd

smaharbA пишет:

в авторском коде … есть но - цикл не передает управление системе и сам жрет

Вот из-за этого он мне и не нравится — где же тут сам Sleep, так сказать?!

22 (изменено: MegaScrew, 2012-08-08 10:47:25)

Re: CMD/BAT: sleep штатными средствами cmd

smaharbA пишет:

так можно и дебагом не создавая файла

что вы имеете в виду? разверните свою мысль в код пожалуйста. я жадный до знаний

В споре рождается истина ))
Предлагаю альтернативу которая не жрет ресурсы CPU

@echo off

:start
echo %time%
call :sleep 10
echo %time%
exit /b 0

:sleep
timeout /t %1 /nobreak >nul
exit /b 0

PS:
У меня win7 Pro  без ресурс кита и все работает. Проверьте кто может на других версиях OS windows.
PSS:
Посмотрел по хелпам MS на их сайте, вроде как timeout появился в составе cmd с Windows Server 2003
В windows XP SP3 его нет, проверил.

23

Re: CMD/BAT: sleep штатными средствами cmd

MegaScrew пишет:

В windows XP SP3 его нет, проверил.

Как и вышеупомянутый «sleep.exe», есть в Resource Kit'ах. Конечно, проблемы наличия утилиты «искаропки» сие не решает.

24

Re: CMD/BAT: sleep штатными средствами cmd

Ещё один вариант работающий в win7 без ресурс кита
и не работающий в win xp sp3

choice /n /t 5 /d y

25 (изменено: MegaScrew, 2012-08-08 12:42:23)

Re: CMD/BAT: sleep штатными средствами cmd

думаю на этом можно заканчивать изыскания
код работает и на win XP pro SP3 и на win 7 Pro  CPU не грузит

@set @x=0 /*
@echo off

set /a mytime=%1*1000

echo PAUSE BEGIN %time%
:: Здесь делаем паузу 
cscript //nologo /e:jscript "%~f0" %mytime%
echo PAUSE END %time%

:: Конец CMD-части
exit /b 0
*/
// JS-часть

WScript.Sleep(WScript.Arguments(0))

26 (изменено: Serge Yolkin, 2012-08-09 00:13:51)

Re: CMD/BAT: sleep штатными средствами cmd

Ещё проверочку на наличие аргумента...
И, как вариант:

@Echo off
Set DELAY=%1
If Not Defined DELAY Set DELAY=1
Echo Pause begin: %TIME%
mshta javascript:"<title>DELAY: %DELAY%sec</title><script>self.resizeTo(250,0);function fc(){window.close()};window.setTimeout(fc,%DELAY%*1000)</script>"
Echo Pause end:   %TIME%
Echo.
pause

27

Re: CMD/BAT: sleep штатными средствами cmd

Serge Yolkin, а от всплывающего окна избавиться можно?
а то как то не очень эстетично это будет к примеру в замкнутом цикле в котором делают sleep к тому же вдруг шаловливый пользователь закроет окно и тогда весь sleep пропал.

28

Re: CMD/BAT: sleep штатными средствами cmd

Ну, вот... Ради сообщения всё и делалось. А убрать можно с экрана: после

self.resizeTo(250,0);

вставить

self.moveTo(-400,-400);

т.е. окно остаётся, но задвинуто на 400px влево-вверх. В этом случае <title>...</title> можно удалить (это заголовок окна), а можно оставить - чтоб в панели задач отображался. Из минусов: особо шаловливый пользователь может райткликнуть на иконке в панели задач и нажать "закрыть окно". Но так и сам каэмдэшник закрыть можно.

29 (изменено: alexii, 2013-03-29 16:47:32)

Re: CMD/BAT: sleep штатными средствами cmd

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

@echo off
set i=1
:delay
ping localhost -n 2 >NUL
set /a i=i+1
cls&echo %i%
if not %i%==360 goto delay
rem соответственно 6 минут в секундах:)+360 миллисекунд

30

Re: CMD/BAT: sleep штатными средствами cmd

Давно есть

timeout /?

Про устаревшие системы можно начать уже забывать

( 2 * b ) || ! ( 2 * b )

31

Re: CMD/BAT: sleep штатными средствами cmd

Не получается .

32

Re: CMD/BAT: sleep штатными средствами cmd

Rumata пишет:

Давно есть

timeout /?

Про устаревшие системы можно начать уже забывать

ну, можно и из страны уехать... только это не решение