Как установить задержку в VBScript - PullRequest
47 голосов
/ 13 ноября 2009

Как установить задержку в VBScript?

WScript.Sleep(100) не работает в Windows XP, Vista.

Ответы [ 10 ]

50 голосов
/ 13 ноября 2009

Работа над этим (XP).

Создайте новый файл, назовите его test.vbs. Поместите это в это.

WScript.Sleep 1000
MsgBox "TEST"

Запустите его, обратите внимание на задержку перед отображением окна сообщения.

Обратите внимание, что число указывается в миллисекундах, поэтому 1000 равно 1 секунде.

30 голосов
/ 16 октября 2012

Если вы пытаетесь смоделировать задержку сна в VBScript, но WScript недоступен (например, ваш скрипт вызывается из инструмента Microsoft BGInfo), попробуйте следующий подход.

В приведенном ниже примере будет задержка до 10 секунд с момента обработки инструкции:

Dim dteWait
dteWait = DateAdd("s", 10, Now())
Do Until (Now() > dteWait)
Loop
20 голосов
/ 13 ноября 2009

, если это VBScript, должно быть

WScript.Sleep 100

Если это JavaScript

WScript.Sleep(100);

Время в миллисекундах. WScript.Sleep 1000 приводит к 1 секунде сна.

10 голосов
/ 05 декабря 2013

Следующая строка заставит ваш скрипт спать 5 минут.

WScript.Sleep 5*60*1000

Обратите внимание, что значение, передаваемое в спящий вызов, указывается в миллисекундах.

9 голосов
/ 26 ноября 2013

Многие ответы здесь предполагают, что вы запускаете VBScript на Windows Scripting Host (обычно wscript.exe или cscript.exe). Если вы получаете ошибки типа ' Переменная не определена: "WScript" ', то вы, вероятно, нет.

Объект WScript доступен только в том случае, если вы работаете под хостом скриптов Windows, если вы работаете под другим хостом скриптов, например Internet Explorer (и вы можете этого не понимать, если находитесь в чем-то вроде HTA) он не доступен автоматически.

Эй, Microsoft, автор сценариев! В блоге есть статья, посвященная именно этой теме Как я могу временно приостановить выполнение сценария в HTA? , в которой они используют VBScript setTimeout для создания таймера для имитации сна без необходимости использования загрузки процессора петли и т. д.

Используемый код:

<script language = "VBScript">

    Dim dtmStartTime

    Sub Test
        dtmStartTime = Now 
        idTimer = window.setTimeout("PausedSection", 5000, "VBScript")
    End Sub

    Sub PausedSection
        Msgbox dtmStartTime & vbCrLf & Now
        window.clearTimeout(idTimer)
    End Sub

</script>

<body>
    <input id=runbutton  type="button" value="Run Button" onClick="Test">
</body>

Подробное объяснение см. В связанном сообщении в блоге , но, по сути, при нажатии кнопки создается таймер, который запускает 5000 миллисекунд с этого момента, а при запуске запускается подпрограмма VBScript под названием «PausedSection» "который очищает таймер и запускает любой код, который вы хотите.

7 голосов
/ 16 октября 2011

Вот еще одна альтернатива:

Sub subSleep(strSeconds) ' subSleep(2)
    Dim objShell
    Dim strCmd
    set objShell = CreateObject("wscript.Shell")
    'objShell.Run cmdline,1,False

    strCmd = "%COMSPEC% /c ping -n " & strSeconds & " 127.0.0.1>nul"     
    objShell.Run strCmd,0,1 
End Sub 
4 голосов
/ 08 октября 2013

лучше использовать таймер:

Sub wait (sec)
    dim temp
    temp=timer
    do while timer-temp<sec
    loop
end Sub
4 голосов
/ 13 ноября 2009

Время ожидания в миллисекундах (мс)

если вы хотите 3 минуты, вот способ сделать это:

WScript.Sleep(1000 * 60 * 3)
3 голосов
/ 12 февраля 2013

Вот обновление решения, предоставляемое @ user235218, которое позволяет вам указать необходимое количество миллисекунд.

Примечание. Параметр -n - это количество повторных попыток, а -w - время ожидания в миллисекундах для проверки связи. Я выбрал адрес 127.255.255.254, поскольку он находится в диапазоне обратной связи, а окна MS не отвечают на него.

Я также сомневаюсь, что это обеспечит точность в миллисекундах, но с другой стороны, я попробовал это в приложении, использующем элемент управления ms script, и пока встроенная функция сна заблокировала интерфейс, этот метод не сделал.

Если кто-то может объяснить, почему этот метод не заблокировал интерфейс, мы могли бы сделать этот ответ более полным. Обе спящие функции выполняются в пользовательском потоке.

Const WshHide = 0
Const WAIT_ON_RETURN = True

Sub Sleep(ByVal ms)

   Dim shell 'As WScript.Shell

   If Not IsNumeric(ms) Then _
       Exit Sub

   Set shell = CreateObject("WScript.Shell")

   Call shell.Run("%COMSPEC% /c ping -n 1 -w " & ms & " 127.255.255.254 > nul", WshHide, WAIT_ON_RETURN)

End Sub
3 голосов
/ 04 декабря 2012

Вот мое решение. Работал со сценарием, который запускался сторонней программой без объявления WScript и без импорта.

Function MySleep(milliseconds)
  set WScriptShell = CreateObject("WScript.Shell")
  WScriptShell.Run "Sleep -m " & milliseconds, 0, true
end Function

Обновление
Похоже, Microsoft удалила Sleep.exe из win 8, поэтому в win 8 это не работает, если вы не поместите Sleep.exe в папку, определенную в% path%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...