Как сожрать любой буферизованный STDIN перед «паузой» в командном файле? - PullRequest
1 голос
/ 08 декабря 2011

Изрядное количество наших "автоматизированных групп установщиков" .bat файлов заканчивается примерно так:

:success
ECHO Success! (as far as I can tell)
ECHO.
ECHO.
ECHO Press any key to reboot...
ECHO.
ECHO.
PAUSE >NUL
shutdown -r
EXIT /b

Если предыдущие команды заняли некоторое время, есть хороший шанс, что пользователь случайно нажалключ задолго до того, как мы достигнем :success метки.Поскольку STDIN кажется буферизированным, это приведет к немедленному отклонению PAUSE.

Я бы предпочел что-то вроде:

GOBBLE_STDIN_SOMEHOW
PAUSE >NUL
shutdown -r

Как бы я "flush "STDIN, потребляя все, что было там, но не ожидая, если ничего не буферизовано?

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Я предлагаю вам использовать альтернативный метод:

:success
ECHO Success! (as far as I can tell)
ECHO.
ECHO.
ECHO Press ENTER key to reboot...
ECHO.
ECHO.
SET /P DUMMY=
shutdown -r
EXIT /b

Однако этот метод завершится ошибкой, если пользователь случайно нажал ENTER ...

0 голосов
/ 08 декабря 2011

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

Протестировано с этим (я использовал Vista)

@echo off
echo Press now some keys
ping -n 3 localhost > nul
echo Stop pressing
ping -n 3 localhost > nul
echo Now Pause starts (and waits)
pause
...