Batch - Eingabe überprüfen
Hallo Community,
ich beschäftige mich seit einigen Tagen mit Batch und habe beschlossen einen einfachen Sleeptimer zu programmieren. Bis jetzt funktioniet er auch. Das einzige was noch Probleme macht ist: Wenn ich bei der Zeitabfrage statt einer Zahl einen Buchstaben eingebe wird der Buchstabe als 0 interpretiert und der PC fährt sofort runter.
Meine Frage ist jetzt: Ob und wenn ja wie es Möglich ist eine Eingabe zu überprüfen ob es sich dabei um eine Zahl handelt.
Danke für eure Hilfe!
ich beschäftige mich seit einigen Tagen mit Batch und habe beschlossen einen einfachen Sleeptimer zu programmieren. Bis jetzt funktioniet er auch. Das einzige was noch Probleme macht ist: Wenn ich bei der Zeitabfrage statt einer Zahl einen Buchstaben eingebe wird der Buchstabe als 0 interpretiert und der PC fährt sofort runter.
Meine Frage ist jetzt: Ob und wenn ja wie es Möglich ist eine Eingabe zu überprüfen ob es sich dabei um eine Zahl handelt.
Danke für eure Hilfe!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 270948
Url: https://administrator.de/forum/batch-eingabe-ueberpruefen-270948.html
Ausgedruckt am: 23.12.2024 um 18:12 Uhr
5 Kommentare
Neuester Kommentar
Hallo Jantleman,
zB. so:
Grüße
rubberman
zB. so:
@echo off &setlocal
set "inp="
set /p "inp=> "
:: Die Eingabe soll numerisch sein und zw. 1 und 5 liegen ...
call :check inp 1 5
if errorlevel 1 (echo Fehler!) else echo %inp% ist gueltig.
pause
exit /b
:check VarName Min Max
setlocal EnableDelayedExpansion
:: Test auf Ziffern (keine anderen Zeichen erlaubt).
for /f "delims=1234567890" %%i in ("!%~1!") do (endlocal &exit /b 1)
:: Test auf gültige Zahl (alles was SET /A fehlerfrei verarbeiten kann).
2>nul set /a "dummy=!%~1!" || (endlocal &exit /b 1)
:: Test auf Dezimalzahl (keine Oktalzahl durch vorangestellte 0).
if "!%~1!" neq "%dummy%" (endlocal &exit /b 1)
:: Test auf Minimum
if %dummy% lss %~2 (endlocal &exit /b 1)
:: Test auf Maximum
if %dummy% gtr %~3 (endlocal &exit /b 1)
endlocal &exit /b 0
rubberman
Hallo Jantleman,
das kann ich, obwohl ich es vorgezogen hätte wenn du etwas spezifischer erklärt hättest, wo genau das Verständnisproblem ist. Ein Supportforum ist natürlich kein Tutorial ...
Das Label heißt
Die "verzögerte Variablenerweiterung" wird aktiviert. Das führt dazu, dass Variablen nicht bereits beim Parsen der Codezeilen zum Wert aufgelöst werden, sondern erst beim Ausführen der jeweiligen Codezeile. Bestimmte Zeichen (wie bspw. unpaarige Anführungszeichen) führen auf diese Weise nicht zu einem Syntaxfehler.
Die Syntax für Variablen ändert sich dahingehend, dass umschließende Prozentzeichen als Anführungszeichen geschrieben werden.
Vorab:
Der Kommandozeileninterpreter kann nur ganzzahligen Werte mit einer Breite von 32 Bit (-2147483648 bis 2147483647) als Zahl verarbeiten. Größere, kleinere oder Fließkommawerte, sind nur als Text interpretierbar. Ich betrachte im folgenden aber lediglich positive Werte.
Eine FOR /F Schleife verarbeitet Streams zeilenweise - einen einzeiligen String-Stream in diesem Fall. %~1 ist der 1. übergebene Parameter. Dieser ist der Variablenname. Durch das Einschließen in Ausrufezeichen wird daraus eine Variable, die zum Variablenwert (der Eingabe) aufgelöst wird. Um eine Zeile in einer FOR /F Schleife zu verarbeiten, können Trennzeichen (delims) definiert werden. Diese splitten die Zeile in Teilstrings, wobei die Trennzeichen selbst entfernt werden. Das mache ich mir hier zu Nutze. Besteht die Zeile nur aus den Zeichen 0-9, dann werden alle Zeichen entfernt und der Schleifenrumpf (hinter dem
Sollten auch andere Zeichen vorhanden sein, wird der Schleifenrumpf ausgeführt. Dort wird mit
Hier wird ein Textvergleich zwischen dem Eingabewert und dem Wert, der von SET /A berechnet wurde, ausgeführt. Beide sollten gleich sein.
Vorab:
Bis zu diesem Punkt haben wir abgeklärt, dass es sich bei der Eingabe um einen positiven, ganzzahligen Dezimalwert handelt, der sich im gültigen Bereich bewegt. Ab jetzt geht es nur noch darum, ob der definierte Minimal- oder Maximalwert unter- bzw. überschritten wurde.
%~2 ist der 2. übergebene Parameter. LSS ist der Operator für "kleiner als".
%~3 ist der 3. übergebene Parameter. GTR ist der Operator für "größer als".
Wenn die Subroutine nicht vorher wegen eines Fehlers verlassen wurde, geben wir nun mit
Grüße
rubberman
das kann ich, obwohl ich es vorgezogen hätte wenn du etwas spezifischer erklärt hättest, wo genau das Verständnisproblem ist. Ein Supportforum ist natürlich kein Tutorial ...
:check VarName Min Max
:check
. Alles was durch ein Leerzeichen davon getrennt ist, gehört nicht mehr dazu. In diesem Fall dienen VarName Min Max
dazu dem Benutzer mitzuteilen, dass 3 Argumente übergeben werden sollen.setlocal EnableDelayedExpansion
Die Syntax für Variablen ändert sich dahingehend, dass umschließende Prozentzeichen als Anführungszeichen geschrieben werden.
Vorab:
Der Kommandozeileninterpreter kann nur ganzzahligen Werte mit einer Breite von 32 Bit (-2147483648 bis 2147483647) als Zahl verarbeiten. Größere, kleinere oder Fließkommawerte, sind nur als Text interpretierbar. Ich betrachte im folgenden aber lediglich positive Werte.
:: Test auf Ziffern (keine anderen Zeichen erlaubt).
for /f "delims=1234567890" %%i in ("!%~1!") do (endlocal &exit /b 1)
do
) wird nicht ausgeführt.Sollten auch andere Zeichen vorhanden sein, wird der Schleifenrumpf ausgeführt. Dort wird mit
endlocal
die verzögerte Variablenerweiterung wieder aufgehoben. Mit dem exit /b 1
wird die Subroutine :check
verlassen und der Wert 1 zurückgegeben, der im Hauptcode als Errorlevel abrufbar ist.:: Test auf gültige Zahl (alles was SET /A fehlerfrei verarbeiten kann).
2>nul set /a "dummy=!%~1!" || (endlocal &exit /b 1)
:: Test auf Dezimalzahl (keine Oktalzahl durch vorangestellte 0).
if "!%~1!" neq "%dummy%" (endlocal &exit /b 1)
Vorab:
Bis zu diesem Punkt haben wir abgeklärt, dass es sich bei der Eingabe um einen positiven, ganzzahligen Dezimalwert handelt, der sich im gültigen Bereich bewegt. Ab jetzt geht es nur noch darum, ob der definierte Minimal- oder Maximalwert unter- bzw. überschritten wurde.
:: Test auf Minimum
if %dummy% lss %~2 (endlocal &exit /b 1)
:: Test auf Maximum
if %dummy% gtr %~3 (endlocal &exit /b 1)
endlocal &exit /b 0
exit /b 0
den Errorlevel 0 an den Hauptcode zurück und signalisieren damit, dass alles OK war.Grüße
rubberman