Vinzenz Mai: Problem in Batch

Beitrag lesen

Hallo,

bin wirklich am verzweifeln mit einer Batch-File.

ich fordere den Benutzer auf eine Eingabe zu machen. Diese wären 1-4 falls er jedoch 5 eingibt soll die Abfrage nochmal kommen.

das ist eine Aufgabe, für die Microsofts Kommandozeileninterpreter nicht besonders geeignet sind. Batchdateien sind typischerweise *nicht* interaktiv und die Kontrollstrukturen von CMD machen es einem nicht leicht.

Dies funktioniert auch, jedoch nicht in meinem bestimmten Fall.

Habe dies mal nachgestellt:
ECHO OFF
cls

goto SetVar

:SetVar
if %2!==! (
set /P test=Type:
echo %test%
goto SetVar
)

jobo hat Dich auf die %2-Problematik hingewiesen. Du hast gar keinen solchen Parameter. Die Eingabe wird bei Dir in die Variable "test" eingelesen. Daher solltest Du diese verwenden.

help if

zeigt Dir, was if kann und was nicht. Kommen wir zu verschiedenen Lösungsansätzen:

a) Vergleiche nacheinander mit den erlaubten Werten. Trifft einer zu, darf
   weitergemacht werden, trifft keiner zu, gehe zurück zum Anfang:

---------------------------------------------------------------------
ECHO OFF
cls

:SetVar
REM Fordere zur Eingabe auf
set /P test=Type:

REM Vergleiche den Eingabewert (eine Zeichenkette) mit den erlaubten Werten.
REM Springe zu weiter, wenn eine Übereinstimmung vorliegt.
if %test%==1 GOTO :weiter
if %test%==2 GOTO :weiter
if %test%==3 GOTO :weiter
if %test%==4 GOTO :weiter
GOTO SetVar

:weiter
ECHO %test%
---------------------------------------------------------------------

Schön ist das nicht, arbeitet aber nach Spezifikation :-)

b) Nutze für den Vergleich die for-Anweisung, siehe help for:
   Springe bei einem erfolgreichen Vergleich zur weiter-Marke
   Falls keiner der Vergleiche erfolgreich war, gehe zurück zu Los.

---------------------------------------------------------------------
ECHO OFF
cls

REM Fordere zur Eingabe auf
:Eingabe
set /P test=Type:

FOR /L %%I IN (1,1,4) DO IF "%%I"=="%test%" GOTO weiter
GOTO Eingabe
:weiter
ECHO %test%
---------------------------------------------------------------------
b) ist schon deutlich besser.

c) Wer auf die Idee kommt, die Option /I von IF zu verwenden, um numerische Vergleiche verwenden zu können mit anderen als dem Gleichheitsoperator, den bestraft CMD damit, dass Eingaben Zeichenketten sind:

---------------------------------------------------------------------
ECHO OFF
cls

:SetVar
REM Fordere zur Eingabe auf
set /P test=Type:

REM Wenn der Eingabewert größer ist als 4, gehe zurück zu Los
IF /I %test% GTR 4 GOTO SetVar
REM Wenn der Eingabewert kleiner ist als 1, gehe zurück zu Los
IF /I %test% LSS 1 GOTO SetVar

REM Wenn wir hier angelangt sind, war die Eingabe möglicherweise im erlaubten Bereich
ECHO %test%
---------------------------------------------------------------------

funktioniert mit Eingaben wie
12
4
7
0
bestens, aber nicht mit Eingaben wie
22.4 oder 3mal

Da die Fähigkeiten von CMD hier sehr beschränkt sind, nutzte ich eher die Powershell oder den Windows Scripting Host.

Freundliche Grüße

Vinzenz