Пакетный файл запрашивает бесконечное время для ввода - PullRequest
0 голосов
/ 18 февраля 2019
@echo off

:cancel

    shutdown /a

:shut

    set a=%1

    shutdown -s -f -t %a%

cls

set /p a="the computer will shut in:" %=%

set /a a=%a%*60

if %a%=="a" call :cancel

pasue

call :shut

pause

Предполагается запросить у пользователя номер.Это займет число и выключит компьютер через x минут (я умножил на 60, чтобы преобразовать в секунды), если ответ «а», это отменит выключение.
Когда я запускаю программу, она спрашивает меня бесконечностьраз для ввода и не вызывает выключения вообще
Спасибо:)

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Глядя на ваш код, я полагаю, вы путаете "метки" с "объявлениями функций".В пакете нет функций (по крайней мере, не так, как в других языках), просто call, goto и «метки»

Для показанной задачи вам вообще не нужны никакие метки:

@echo off
set /p a="the computer will shut in:" %=%
if /i "%a%"=="a" shutdown -a & goto :eof
set /a a*=60
shutdown -s -f -t %a%

(Примечание: в вашем коде произошел логический сбой: set /a всегда возвращает целое число (если это не приводит к синтаксической ошибке), поэтому сравнивать не имеет смыслапеременная со строкой a после set /a)

Рекомендуется прочитать: Куда возвращается GOTO: EOF?

0 голосов
/ 18 февраля 2019

Попробуйте это:

::It's better to comment out @echo off, and only when the .bat works fine and then use it.
::@echo off

cls
set /p a="the computer will shut in:"
::You'll need to put %a% inside quotes too, otherwise it can't be equal when you input a.
if "%a%"=="a" call :cancel & goto :eof

:: equals to set /a a=a*60, and with /a you don't need %
set /a a*=60

:: You forgot the parameter. And the goto :eof is necessary
call :shut %a%
pause && goto :eof

::You need to put functions at last.
:cancel
    shutdown /a
    goto :eof
:shut
    set a=%1
    shutdown -s -f -t %a%

Основная проблема в вашем коде - поток выполнения.
Когда нет переключателя или goto s, он будет выполнять команды от первой строки до последней строки.
(Вот почему он спрашивал вас бесконечно много раз, потому что каждый раз, когда вы call :cancel, он будет выполнять функцию от :cancel до set /p снова.)

Вам нужно поместить функции нижеосновные коды.
А в функции нужно добавить goto :eof (кроме последней строки, поскольку она уже есть e nd o f f ile).
А после вызова функции нужно добавить goto :eof тоже.

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