Попробуйте это:
::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
тоже.