CMD Nach Tastendruck Sofortige Reaktion?

1 Antwort

dafür gibts den Choice -Befehl.

demo.cmd

@echo off
chcp 65001 >nul &rem umlaute

echo [M]ach was        [W]as anderes
echo [A]ffen füttern   [N]ichts tun
echo E[x]it
:loop
choice /c mwanx 
if %Errorlevel% equ 1 (goto :Machwas)
if %Errorlevel% equ 2 (goto :Wasand)
if %Errorlevel% equ 3 (goto :Affen)
if %Errorlevel% equ 4 (goto :nix)
if %Errorlevel% equ 5 (exit /b)
goto :loop

:Machwas
echo hallo ich machwas
goto loop

:Wasand
echo hallo ich mach was Anderes
goto loop

:Affen
echo hallo ich füttere Affen
goto loop

:nix
echo ...lalala...
goto loop

Achtung , Choice gibt die Ausgewählte Option per Fehlercode weiter. Zwischen den Choice-befehl und der Abfrage der Errorlevel darf kein Befehl ausgeführt werden welcher seinerseits einen Errorlevel setzt!

...ansonsten muss man den Errorlevel in einer anderen Variable sichern und diese Vergleichen.

demo2.cmd

@echo off
chcp 65001 >nul
echo [M]ach was    [W]as anderes
echo E[x]it

choice /c mwx 
echo Errorlevel=%Errorlevel%
set "myChoice=%Errorlevel%"
ver  &rem setzt immer Errorlevel auf 0 
echo Errorlevel=%Errorlevel%

if %myChoice% equ 1 (echo dummmy)
if %myChoice% equ 2 (echo dummmy)
echo Schluss
pause
exit /b

choice kann nur Buchstaben und Zahlen aber keine anderen Zeichen. Werden Eingaben wie Enter, Leerzeichen oder anderes benötigt, kann man sich eines Tricks bedienen:

rchoice.cmd

@echo off
  rem Umlaute richtig darstellen.
chcp 65001>nul
  rem Macro %getKey% initialisieren. Ein Macro ist beqemer zu verwenden, als jedesmal dieses Monsterzeile zu schreiben.
set "getKey=for /f "tokens=2 delims=] skip=1" %%. in ('replace.exe ? . /u /w ^|find /n /v ""') do (set "getKey.Key=%%~.")"

  rem test...
:MainMenu
echo: 
echo Waehle :
echo [Enter] blah ^| [X] Batch Verlassen
echo [A] muh      ^| [D] Lorem
echo [Y] iwas     ^| [R] Rummel
echo [1]rumpel    ^| [9] Miff
:Frage


%getKey%
  rem eine Zeile für viele Verzweigungen
  rem im in-Block können Normale Zeichen (Buchstaben und Zahlen) durch Komma oder Leerzeichen getrennt aufgelistet werden.
for %%a in ( A,D,1,9,Y,R) do (if /i "%getKey.Key%"=="%%a" call :Label%%a)
  rem Zeichen, welche nicht in einm Label vewendet werden dürfen müssen wie gehabt einzeln mit if abgefragt werden
if "%getKey.Key%"=="" call :LabelEnter
  rem oder vom Standartvorgehen (hier call :Label%%a) abweichende Behandlungsroutinen
if /i "%getKey.Key%"=="X" goto :Ende
  rem wenn keine der  vorgesehenen Tasten, wieder zum Einlesen springen
goto :frage

:Ende
echo  ...und Tschüß
timeout 3 >nul
exit /b

:::: Subroutinen :::::
:LabelEnter
echo blah und Blubb
echo maus und katz jagt hund
echo:
exit /b

:LabelA
echo muh und Mäh
echo schuhu
echo:
exit /b

:LabelD
echo lorem ipsum
echo Mangni est Pumuckl
echo:
exit /b

:Label1
echo Rumpelheinzchen seiner Oma ihr Hund
echo:
exit /b

:Label9
echo Miff maff mupp
echo:
exit /b

:LabelY
echo keine Ahnung
echo:
exit /b

:LabelR
echo Ägypten?
echo:
exit /b
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren