Bat файл pause не работает

Обновлено: 06.07.2024

Рассмотрим основные варианты организации ожидания ( паузы ) в bat / cmd файлах.

Для решения этой задачи в операционных системах, начиная с VISTA, присутствует команда timeout. Так, для ожидания 10 секунд следует выполнить команду.

Если не использовать параметр /NOBREAK, то ожидание может быть прервано нажатием любой клавиши.

Как и во многих других случаях, может помочь утилита nircmd.
(На момент написания страницы описание возможностей утилиты было здесь. C этим списком я рекомендую ознакомится, даже если для текущей задачи будет использовано другое решение.)

На просторах интернета можно найти утилиту wait.exe. Точнее, даже несколько разных, включая исходные тексты программы. Поэтому я не привожу здесь параметров вызова, смотрите их описание.

Для организации паузы можно использовать утилиты, ожидающих определенное событие заданное время.
При условии, что событие не наступит, получается ожидание требуемого интервала времени.
Так, паузу можно создать при помощи команды ping:

В том же пакете Ресурскит есть утилита choice, которую при известной доле извращенности можно использовать для тех же целей:

0,-3% :: пауза на 15 секунд call :sleep 15 :: Другие действия echo Сейчас %time:

0,-3% pause goto :EOF :sleep echo Пауза на %1 секунд. set /a ftime=100%time:

6,-3%%%100+%1 if %ftime% GEQ 60 set /a ftime-=60 :loop set ctime=%time:

6,-3% if /i %ftime% NEQ %ctime% goto :loop exit /b 0

Данная процедура позволит организовать задержку в выполнении. Время ожидания должно быть меньше 60 сек.

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

Установка и загрузка ОС Виндовс

Задержка времени (пауза, тайм-аут) в бат-файле

Вот, нашёл в Сети рабочий пример для устройства задержки времени
(пауза, тайм-аут) при выполнении команды в bat-файле:

echo wscript.Sleep 30000>"%temp%sleep30.vbs"
cscript //nologo "%temp%sleep30.vbs"
del "%temp%sleep30.vbs"

Работает в любой ОС Windows, аж бегом

Зачем нужна задержка (пауза, тайм-аут) при выполнении команды в bat-файле?

У всех – по-разному.
Лично мне она (пауза) понадобилась вот для чего:

– Взял простенький bat-файл для очистки временных папок и бросил его в АВТОЗАГРУЗКУ
Прикололся, типа – чтобы этот батничек чистил временные каталоги при запуске системы.
Текст батника вытащил из стандартного Total Commander-a:

cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:WindowsPrefetch &del *.pf 2>nul &cd/d C:WindowsTemp&rd/s/q c:windows emp 2>nul

Всё-бы ничего, да только такая процедура очистки временных папок при загрузке –
сносит полезные файлы и система выдаёт окно ошибки

Полный текст bat-файла стал теперь таким:

echo wscript.Sleep 30000>"%temp%sleep30.vbs"
cscript //nologo "%temp%sleep30.vbs"
del "%temp%sleep30.vbs"
cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:WindowsPrefetch &del *.pf 2>nul &cd/d C:WindowsTemp&rd/s/q c:windows emp 2>nul

Прим. Лошади понятно, что изменив цифру 30 на своё значение,
можно получить другие величины паузы в секундах в bat-файле.

Начиная с VISTA, в операционных системах семейства Windows присутствует команда TIMEOUT. Эта команда принимает значение таймаута, равного фиксированному периоду времени ожидания (в секундах) до выполнения команды или ожидание до нажатия клавиши. Имеется также параметр, зaдающий игнорирование нажатий клавиш.

Синтаксис
TIMEOUT [/T] 50 [/NOBREAK]

Параметры

/T 50 Таймаут = 50 сек. Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд. Значение, равное -1 задает неограниченное время ожидания до нажатия клавиши. /NOBREAK Игнорировать нажатия клавиш, ждать указанное время. /? Отображение справки в командной строке.

TIMEOUT /?
TIMEOUT /T 10
TIMEOUT /T 300 /NOBREAK
TIMEOUT /T -1

Весь текст примера можно внести в bat-файл,
запустить и посмотреть, как это работает.
Впечатляет.

Когда-то, еще в DOS, для организации ожидания в командном файле использовалась удобная команда SLEEP, но затем она почему-то перекочевала из стандартного установочного набора Windows в дополнительный Resource Kit. Можно просто скопировать его оттуда в каталог system32 и использовать в ваших командных файлах.

Если же Resource Kit нет под рукой, можно воспользоваться ранее рассмотренной командой CHOISE без вывода текста и с автоматическим формированием ответа через nn секунд (1-99):

Поиск компьютеров с запущенным приложением

В заключение добавлю, что для того, чтобы этот скрипт работал, PSlist.exe и PSkill.exe должны быть доступны в путях поиска исполняемых файлов, например в каталоге WINDOWS. Пользователь, запускающий его, должен обладать правами администратора по отношению к сканируемым компьютерам. И, если текущий пользователь таковым не является, то в параметры запуска утилит PSlist.exe и PSkill.exe нужно добавить ключи, задающие имя пользователя и пароль.

Поиск компьютеров с запущенным приложением по списку

В предыдущем примере использовался прямой перебор IP-адресов компьютеров в локальной сети, что не всегда удобно, поскольку в процедуру опроса оказываются вовлечены и выключенные компьютеры. Решим задачу другим способом. Создадим текстовый файл со списком компьютеров и опросим их по этому списку.
Список можно получить из сетевого окружения с использованием команды:
net.exe view > comps.txt
После выполнения такой команды файл comps.txt будет содержать список следующего вида:

Обрабатывать содержимое этого текстового файла будем с помощью команды FOR с ключом /F:

FOR /F ["ключи"] %переменная IN (имя файла) DO команда [параметры]

Окончательный вид команды:

FOR /F "eol=К skip=4 tokens=1 " %%I IN (comps.txt) DO (
pslist.exe -u admin -p pass %%I %1
IF NOT ERRORLEVEL 1 net.exe send ADMINCOMP %%i %1
)

Не нашли то, что искали? Воспользуйтесь поиском:

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

Я просмотрел другие вопросы по SO и проверил, чтобы концы строк были CRLF и у меня есть CRLF в конце файла.

ОТВЕТЫ

Ответ 1

Выполняется ли последняя команда до паузы? Разделите свой script - по крайней мере последние несколько команд?

В качестве альтернативы, поскольку вы, похоже, используете Windows7, попробуйте команду Timeout и посмотрите, работает ли она.

Ответ 2

Если последняя команда не работает, пауза не будет работать.

Так, например, у меня был пакетный файл phpunit, который выглядел так:

Когда phpunit не удалось, он просто вышел без паузы. Изменение его на это заставило его сделать паузу правильно:

Ответ 3

Я думаю, я знаю, где проблема, у меня была та же проблема. Поэтому, если вы делаете это так, вы создаете новый файл и помещаете в него всю информацию о пакете и сохраняете его как обычный текст, и после этого просто переименуйте расширение, которое не будет работать:). Вы должны сохранить его через текстовый редактор, и оттуда вы должны выбрать "Пакетный файл (.bat;.cmd; *. Nt)", например, Notepad ++, вероятно, из-за кодирования, так что сделайте это так, и я thnk его будет в порядке. GL!:)

Ответ 4

У меня были проблемы даже с эхом. предполагая, что это было вызвано длинным пакетным файлом. Пауза выполнялась, но она не приостанавливалась, это было почти так, как будто нажатие клавиши после выполнения Pause.

Пробовал предлагаемые решения выше; никто не работал.

Итак, просто для справки в будущем, вот что я сделал:

В принципе просто "пауза" > nul & pause > nul "; работает каждый раз.

Ответ 5

Просто добавив ответ Тима, если вы хотите, чтобы окно всегда отображалось, вы можете записать файл .bat, например:

Вот, нашёл в Сети рабочий пример для устройства задержки времени
(пауза, тайм-аут) при выполнении команды в bat-файле:

echo wscript.Sleep 30000>"%temp%\sleep30.vbs"
cscript //nologo "%temp%\sleep30.vbs"
del "%temp%\sleep30.vbs"

Работает в любой ОС Windows, аж бегом

Зачем нужна задержка (пауза, тайм-аут) при выполнении команды в bat-файле?

У всех – по-разному.
Лично мне она (пауза) понадобилась вот для чего:

– Взял простенький bat-файл для очистки временных папок и бросил его в АВТОЗАГРУЗКУ
Прикололся, типа – чтобы этот батничек чистил временные каталоги при запуске системы.
Текст батника вытащил из стандартного Total Commander-a:

cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul

Всё-бы ничего, да только такая процедура очистки временных папок при загрузке –
сносит полезные файлы и система выдаёт окно ошибки

Досадно.
Однако, устройство паузы в 30 сек. решило всю проблему.
И система грузится, и папки темпов - чистятся.

Полный текст bat-файла стал теперь таким:

echo wscript.Sleep 30000>"%temp%\sleep30.vbs"
cscript //nologo "%temp%\sleep30.vbs"
del "%temp%\sleep30.vbs"
cmd /c title Очистка временной папки &cd/d %temp%&rd/s/q %temp% 2>nul &cd/d %tmp%&rd/s/q %tmp% 2>nul &cd/d C:\Windows\Prefetch &del *.pf 2>nul &cd/d C:\Windows\Temp&rd/s/q c:\windows\temp 2>nul

Прим. Лошади понятно, что изменив цифру 30 на своё значение,
можно получить другие величины паузы в секундах в bat-файле.

Начиная с VISTA, в операционных системах семейства Windows присутствует команда TIMEOUT. Эта команда принимает значение таймаута, равного фиксированному периоду времени ожидания (в секундах) до выполнения команды или ожидание до нажатия клавиши. Имеется также параметр, зaдающий игнорирование нажатий клавиш.

Синтаксис
TIMEOUT [/T] 50 [/NOBREAK]

Параметры

/T 50 Таймаут = 50 сек. Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд. Значение, равное -1 задает неограниченное время ожидания до нажатия клавиши. /NOBREAK Игнорировать нажатия клавиш, ждать указанное время. /? Отображение справки в командной строке.

TIMEOUT /?
TIMEOUT /T 10
TIMEOUT /T 300 /NOBREAK
TIMEOUT /T -1

Весь текст примера можно внести в bat-файл,
запустить и посмотреть, как это работает.
Впечатляет.

Я создаю простой командный файл, чтобы помочь в нескольких вещах, и у меня есть некоторые инструкции, которые он распечатывает, и которые я хочу, чтобы пользователь увидел перед выходом. В настоящее время окно закрывается очень быстро. Итак, я добавил PAUSE в конце файла, но он не хочет работать.

Я посмотрел на другие вопросы о SO и проверил, чтобы окончание строк CRLF и что у меня есть CRLF в конце файла.

Если последняя команда терпит неудачу, пауза не будет работать.

Например, у меня был пакетный файл phpunit, который выглядел так:

Когда phpunit не удалось, он просто вышел без остановки. Изменение этого заставило это сделать паузу правильно:

Последняя команда перед паузой успешно выполняется? Не могли бы вы поделиться своим сценарием - хотя бы последние несколько команд?

В качестве альтернативы, поскольку вы, похоже, используете Windows7, попробуйте команду Timeout и посмотрите, работает ли она.

У меня были проблемы даже с эхом. при условии, что это было вызвано длинным пакетным файлом. Пауза выполнялась, но не делала паузу, это было почти так, как будто она нажимала клавишу после выполнения Паузы.

Попробовал предложенные решения выше; никто не работал.

Так что для дальнейшего использования, вот что я сделал:

В основном просто "pause > nul && pause > nul"; работает каждый раз.

Я думаю, я знаю, где проблема, у меня была такая же проблема. Поэтому, если вы делаете это так, вы создаете новый файл, помещаете в него всю информацию о пакете и сохраняете его как обычный текст, а после этого просто переименовываете расширение, оно не будет работать:). Вы должны сохранить его с помощью текстового редактора, и оттуда вы должны выбрать "Пакетный файл (.bat;.cmd; *. Nt)", например Notepad++, вероятно, из-за кодировки, так что сделайте это так, и я думаю, что будет в порядке. GL!:)

К вашему сведению: ничего из показанного выше у меня не работало в Win7.

Однако это, наконец, сработало:

Это также НЕ сработало для «тайм-аута». Без него получится следующее:

ОШИБКА: перенаправление ввода не поддерживается, .

С его помощью получается следующее:

ОШИБКА: дескриптор недействителен.

В моем случае это произошло после того, как я сделал следующее:

start / WAIT cmd.exe /V:ON /k "установить IEdir и pushd%IEdir% & cd & вызвать"C:\Program Files\Internet Explorer\iexplore.exe"и установить XsetRC1=!errorlevel! и установить Xset & echo Xrc1=! XsetRC1! & Popd & timeout / T 3 & EXIT!XsetRC1!"

где IE возвращает RC=1 (что также получает KILL).

Однако то же самое для FireFox и Thunderbird:

start / WAIT cmd.exe /V:ON /k "установить FFdir & pushd%FFdir% & cd & call"C:\FireFox\FireFox.exe"и установить XsetRC1=!errorlevel! & установить Xset & echo Xrc1=! XsetRC1 ! & popd & timeout / T 3 & EXIT!XsetRC1!"

где FF и TB возвращают RC=0, «тайм-аут» ДЕЙСТВИТЕЛЬНО работает.

Также обратите внимание, что ПАУЗА НЕ завершается ошибкой в ​​Win10.

Я не мог понять почему pause только ненадолго остановился в моем сценарии. Ответы здесь помогли мне решить проблему, и я наконец понял, что происходит в моем случае:

start /b

Если вы запускаете приложение с start /b возможно, приложение отправит некоторый вывод на стандартный вывод после задержки. Если этот вывод появляется, когда pause команда запущена, это будет интерпретировано как нажатие клавиш и, естественно, сценарий продолжится. У вас наверняка возникнет эта проблема, если вы используете start /b с командами, которые подключаются к удаленным компьютерам:

Читайте также: