Search code examples
batch-fileif-statementcommandsetgoto

I need to press a specific key and have my script " GO TO" another part in the script


I have a batch script that I desperately need help with. I use a batch script to grab files from folders and move them. The script sweeps the folders every 30 sec but you can "press a key to continue" also. I need to change it so I can press a specific key, doesn't matter what key, and have it GO TO the top location of my script to reset.

Below is a striped down version of what I currently have.

@echo off

set /p username=ENTER LOGIN:

echo.

:pc

echo   1 -- Flats
echo   2 -- Simple Tabletop

set /P rmFunc="Enter a choice: "
for %%I in (1 x) do if #%rmFunc%==#%%I goto run%%I

:run1
set pc=300
goto begin

:run2
set pc=400
goto begin

:begin
set studio=TT
set computer=Handbag_1
set setnumber=
set studiosetnumber=%studio%_%setnumber%
set delay_swch=5
set delay_loop=30

:bottom

echo logged in as: %username%

timeout /t %delay_loop%
GOTO BOTTOM

Solution

  • It is not possible to determine what key was pressed when using TIMEOUT, so that command is of no help.

    You could use the CHOICE command with the /T (timeout) and /D (default) options instead. You can no longer simply press any key. Instead you can only press one key to restart, and another specific key to continue, or wait till the default value (continue) is returned. The biggest drawback is it no longer has a visual countdown.

    echo Press C to Continue, or R to Restart
    choice /c cr /d c /t 30 /n /m "The process will automatically continue in 30 seconds "
    if errorlevel 2 goto pc
    goto bottom
    

    You could display a countdown timer by adding a third undocumented default option and setting the timeout to 1 second. If the default is returned, then it decrements the counter. Once the counter reaches 0 then the desired time has elapsed and you treat it as Continue.

    I use the SET /P trick to display the prompt with a without a newline. I end with a carriage return so that the next prompt displays from the beginning of the same line.

    The countdown timing will be a bit off, but it should be plenty good enough.

    The carriage return variable must be defined and delayed expansion must be enabled near the top (before any loop label).

    :: Define CR to hold a carriage return (0x0D)
    for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"
    
    :: Delayed expansion must be enabled to use the CR variable
    setlocal enableDelayedExpansion
    

    The timer code then becomes

    set wait=15
    :waitLoop
    <nul set /p ="Press C to Continue, or R to Restart. Auto continue in %wait% seconds.   !CR!"
    choice /c 0cr /t 1 /d 0 >nul
    if errorlevel 3 echo(&goto pc
    if errorlevel 2 echo(&goto bottom
    set /a wait-=1
    if %wait% equ 0 echo(&goto bottom
    goto :waitLoop