badbatchcoder
Goto Top

Erkennen ob eine Taste gedrückt wurde (und wenn möglich den "Piepton" bei falscher Taste unterdrücken)

Liebe Batch-Community,

ich arbeite gerade an einem Programm und möchte, dass erkannt wird, ob "W", "S" oder "E" gedrückt wurde und dieser Wert dann als die Variable %menue_pressed% festgelegt wird.
Außerdem soll bei einer falschen Taste der normal ertönende "Piepton" unterdrückt werden. Ist das irgendwie möglich? Ich habe das schonmal mit "errorlevel" ausprobiert, doch es hat nicht
funktioniert. Ich hoffe mir kann hierbei jemand weiterhelfen. =)

(Wenn das mit dem Unterdrücken des Pieptons nicht möglich ist, ist es auch nicht so schlimm.)

Hier nochmal ein Beispiel:
*Der Benutzer drückt die Taste "W"*
"W" wird als String für die Variable %menue_pressed% festgelegt.

Dann wird der Wert als Text ausgegeben:
@echo off
echo %menue_pressed%
W

Content-ID: 584533

Url: https://administrator.de/contentid/584533

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

rubberman
Lösung rubberman 03.07.2020 aktualisiert um 14:34:15 Uhr
Goto Top
CHOICE

@echo off &setlocal
choice /c WSE /n /m "Druecke W, S oder E: "  
if errorlevel 3 (set "menue_pressed=E") else if errorlevel 2 (set "menue_pressed=S") else set "menue_pressed=W"  
echo %menue_pressed%
pause
Piepton ist built-in bei choice und lässt sich nicht unterdrücken. Wenn das ein must-have ist, kann ich dir noch ein ellenlanges Workaround hinterher schieben …

Steffen
BadBatchCoder
BadBatchCoder 03.07.2020 um 14:38:02 Uhr
Goto Top
Sieht gut aus! =)

Hatte bisher noch keine Zeit das Skript zu testen aber schonmal vielen Dank für die schnelle Antwort.
Ich hätte nur eine Frage: Was genau bewirkt der Befehl "setlocal" am Anfang?

LG BatchCoder
rubberman
rubberman 03.07.2020 um 17:06:29 Uhr
Goto Top
Was genau bewirkt der Befehl "setlocal" am Anfang?

Das erzeugt ein Subenvironment, das bei Scriptende oder endlocalwieder verlassen wird. Änderungen der Umgebung (bspw. Variablenwerte) sind auf diese Scope beschränkt. Für stand-alone Scripts die du per Doppelklick ausführst, ist das weniger interessant. Wenn du das Script aber aus einer CMD Shell heraus ausführst, würden diese Änderungen der Umgebung auch in dieser Shell wirksam. Wenn du dann das nächste Script aus derselben Shell ausführst, hast du die vordefinierten Variablen aus dem vorhergehenden Aufruf auch dort wieder, was zu unerwarteten Nebenwirkungen führen kann. Beispielsweise wenn du ein if defined mit einem Variablenname ausführst, bei dem du davon ausgehst, dass die Variable nicht definiert wurde, aber tatsächlich doch bereits von der Shell vererbt wurde.

Steffen
BadBatchCoder
BadBatchCoder 03.07.2020 um 17:32:04 Uhr
Goto Top
Ah ok, das ist also nicht unbedingt notwendig?
Nur wenn das Skript von einem anderen aufgerufen wurde, oder?
rubberman
rubberman 03.07.2020 aktualisiert um 18:04:02 Uhr
Goto Top
Das lässt sich nicht verallgemeinern. Es ist mein persönliches Default weil es in den meisten Fällen entweder nützlich ist oder zumindest nicht schadet. Du musst von Fall zu Fall entscheiden, anhand dessen was ich dir bezüglich des Subenvironments geschrieben habe.
@echo off
set "a=1"  
echo a=%a%

setlocal
:: 1 wird in das Subenvironment vererbt
echo a=%a%
:: a wird geändert
set "a=2"  
echo a=%a%
:: Änderung wird unwirksam
endlocal

echo a=%a%
pause
Ausgabe ist
a=1
a=1
a=2
a=1


Kontraproduktiv ist es dort, wo du willst dass das Environment übernommen werden soll.
Bspw.:

caller.bat
@echo off &setlocal
call "settings.bat"  
echo %a%
echo %b%
pause

settings.bat
:: hier wäre das setlocal kontraproduktiv, da die Definitionen der Variablen nach Beenden des Scripts unwirksam würden
set "a=1"  
set "b=2"