Page 1 of 1

Choice listen to spacebar

Posted: 28 Oct 2009 03:27
by psychoshooter
hello everyone,

Im trying to write a batch file that waits till spacebar is hit and then does a certain thing or if nothing happens in 10 seconds it goes back to start.
Now i tried to use choice but i dont know how it listens to spacebar.
Does anybody know how to use it or has another idea?

this is my code now:

Code: Select all

CHOICE /C:1{herethespacebarthen??} /N /T:1,10 press space to continue
IF ERRORLEVEL == 2 GOTO 2
IF ERRORLEVEL == 1 GOTO 1


Kind regards,
Martijn

Re: Choice listen to spacebar

Posted: 25 Sep 2013 11:12
by taersious
You cannot. Choice will not listen for anything not in the list specified by the /c command argument besides Escape and Ctrl+Break.

Code: Select all

:start
CHOICE /C:10 /N /T:1,10 /m "Press Esc to Continue"
IF ERRORLEVEL == 2 GOTO start
IF ERRORLEVEL == 1 GOTO end
IF ERRORLEVEL == 0 GOTO ESC
:end
echo.
echo You pressed 1
goto exit
:ESC
echo.
echo You pressed Escape
:exit
echo End of program

Re: Choice listen to spacebar

Posted: 25 Sep 2013 14:50
by jeb
You can't solve it with choice but with XCOPY :!:

Not obviously, but it's not necessary to understand it to use it.

Code: Select all

setlocal EnableDelayedExpansion
:waitForSpace
call :GetKey myKey
if "!myKey!" NEQ " " goto :waitForSpace
echo end
exit /b

:GetKey
set "key="
for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
  if not defined key set "key=%%L"
)
set "%~1=!key:~-1!"
exit /b

Re: Choice listen to spacebar

Posted: 26 Sep 2013 13:32
by aGerman
@jeb

Maybe an off topic question ...
If you deviate from the defaults then usually not without a deeper meaning. What's the advantage of "USEBACKQ" in that case? Is there any risk to fail without it?

Regards
aGerman

Re: Choice listen to spacebar

Posted: 27 Sep 2013 01:34
by jeb
Hi aGerman,

aGerman wrote:If you deviate from the defaults then usually not without a deeper meaning. What's the advantage of "USEBACKQ" in that case? Is there any risk to fail without it?

In this case the code is the result of a very long trail and error process, beginning with xcopy /p, multithreading pipes and so on.
I made so many different tests that the end result works, but it's neither optimized nor full stable, it's a proof of concept.
So in this case there isn't a deeper meaning :)

But I saw that carlos (or someone else) build a stable function with the xcopy technic (all characters, delayed expansion Dis/enable independent).
Sorry I can't remember where I saw this, but a small example how to use a SO: colored password input with this technic

jeb

Re: Choice listen to spacebar

Posted: 27 Sep 2013 11:02
by aGerman
Thanks jeb,
it was only out of curiosity :wink:

Sorry I can't remember where I saw this

I also don't know the origin thread but we discussed the script there:
how to display password in asterisk

I thought I already posted a CHOICE emulation but I don't even remember where. So what ...

Code: Select all

@echo off &setlocal
<nul set /p "=Yes or No [yn]: "
call :choice yn
echo Option #%errorlevel% was chosen.
pause
goto :eof


:choice
setlocal DisableDelayedExpansion
set "n=0" &set "c=" &set "e=" &set "map=%~1"
if not defined map endlocal &exit /b 0
for /f "delims=" %%i in ('2^>nul xcopy /lw "%~f0" "%~f0"') do if not defined c set "c=%%i"
set "c=%c:~-1%"
if defined c (
  for /f delims^=^ eol^= %%i in ('cmd /von /u /c "echo(!map!"^|find /v ""^|findstr .') do (
    set /a "n += 1" &set "e=%%i"
    setlocal EnableDelayedExpansion
    if /i "!e!"=="!c!" (
      echo(!c!
      for /f %%j in ("!n!") do endlocal &endlocal &exit /b %%j
    )
    endlocal
  )
)
endlocal &<nul set /p "=" &goto choice

... where I hope the invisible ASCII 0x07 (beep character) next to the equal sign in the last line is working again if you copy the code out of the forum ...

Regards
aGerman

Re: Choice listen to spacebar

Posted: 18 May 2016 09:52
by cbudin
Hi,

This post is very helpful. But I'm looking for a couple of modifications
to the :choice subroutine posted above.

What I'd like to do is be able to tell if the user hit any key on the keyboard,
and also have it time out after a set number of seconds and be able to
detect that as well (like the choice /t option).

There's some pretty complex stuff going on in that script with xcopy and
such and I'd prefer not to have to wade through it all to make what seem
like simple changes.

Can anyone help me out?

Thanks,
Clay Budin
NYC