Es soll überprüft werden, ob eine Variable Element einer Liste ist. Ähnlich wie CHOICE wird eine Liste möglicher eingaben überprüft. Im Unterschied zu CHOICE liefert chkInput -1 für wahr (Eingabe ist Element der Liste) oder 0 für falsch (Eingabe ist nicht Element der Liste); statt dem ERRORLEVEL. Darüber hinaus sind die Elemente der Liste Semikolongetrennt und sowohl die Liste als auch die Eingabe in "" zu übertragen. So werden auch Zeichenketten die Leerzeichen enthalten korrekt überprüft.
Ein weiterer Unterschied ist, dass keine unmittelbare Eingabe erforderlich ist. Es können auch Variablen im laufenden Code überprüft werden.
Die Funktion mit Beispielaufruf findet ihr unten.
REM *************************************************
REM * Name: chkInput.bat *
REM * Type: Function* *
REM * Autor: Tim Pustelni *
REM * Date: 23.01.2017 *
REM *************************************************
REM * Description *
REM * Vergleicht die Eingabe (%2) mit einer Liste *
REM * (%3) Semikolongetrennter Eingaben *
REM * Alternative zu choice, die nur den Errorlevel *
REM * ausgibt *
REM *************************************************
REM * Input: %1 Name der Variablen f.d. Ausgabe *
REM * %2 Zu prüfende Eingabe *
REM * %3 Liste Semikolongetrennter Eingaben *
REM *************************************************
REM * Output: 0 (False) Wert nicht in der Liste *
REM * -1 (True) Wert in der Liste *
REM *************************************************
REM * Anmerkung: - Setlocal EnableDelayedExpansion *
REM * beim Aufruf erforderlich *
REM *************************************************
REM * Aufrufbeispiel (Anführungszeichen notwendig): *
REM * SET /P Eingabe=Eingabe: *
REM * SET LIST=1;3 ;4; *
REM * CALL chkInput.bat chk "%Eingabe%" "%LIST%" *
REM *************************************************
REM um Leerzeichen in den Vergleich einzubeziehen, müssen Suchstring und Liste innerhalb ""
REM übergeben werden. Das ~ Zeichen befreit die String wiederum davon
SET "Eingabe=%~2"
SET "sLIST=%~3"
REM Standard=nein; wenn nicht in der Liste bleibt
SET Ausgabe=0
SET %1=0 & REM Standard=nein
SET cnt=1
:Schleife
REM zu vergleichende Werte immer In "" einfassen. So werden auch Leerzeichen korrekt berücksichtigt
FOR /F "delims=; tokens=%cnt%" %%i IN ("%sLIST%") DO (
IF "%Eingabe%" EQU "%%i" (
SET Ausgabe=-1
GOTO :SchleifeEnde & REM Ausstieg wenn gefunden (besser wird's nicht)
) ELSE (
SET /A cnt+=1
GOTO :Schleife
)
)
:SchleifeEnde
SET %1=%Ausgabe%
:EOF %1
CALL [VERZEICHNIS]chkInput.bat RÜCKGABEVARIABLENNAME "ZU_SUCHENDER_WERT" "LISTE_MIT_WERTEN"
Beispielhafter Aufruf (Test_chkInput.bat im Anhang enthalten). Wenn die Datei chkInput.bat nicht im selben Verzeichnis liegt, muss ein relativer oder absoluter Pfad angegeben werden.
@echo off & setlocal
Setlocal EnableDelayedExpansion
CLS
SET /P Eingabe=Eingabe:
SET LIST=1;3 ;4;
CALL chkInput.bat chk "%Eingabe%" "%LIST%"
Echo %chk%
Pause