"If greater than" in Batch?
Hallo,
Ich mach grade einen simpelen TImer, habe aber folgendes problem:
If hat sich irgendwie verändert. gtr equ und der Kram funktioniert nicht mehr.
"If %test% == 10 goto bla" == funktioniert noch
"If %test% gtr 10 goto bla" gtr, equ lss usw. funktionieren nicht mehr und geben einen Syntax error aus
Ich hab das schon länger nicht mehr gemacht aber früher ging das doch noch?
Gelöst. Falls jemand den code haben will (der relativ unpraktisch ist xD), hier:
@echo off
color 0a
cls
title Timer
set /p test="Gebe Sekundenanzahl an: "
set "testsec=%test%"
:a
cls
color 0a
if %testsec% geq 60 goto unter60
:next
echo %testmin% Minuten und %testsec% Sekunden verbleibend
set /a test=%test%-1
set "testsec=%test%"
set /a testmin=%test%/60
timeout 1 > nul
if %test% == 0 goto ende
goto a
:ende
color 0c
cls
echo Timer erreicht
pause > nul
:unter60
set /a "testsec=%testsec%-60"
if %testsec% lss 60 goto next
goto unter60
2 Antworten
Bei numerischen Variablen:
set "var=12"
if %var% gtr 10 echo größer
Bei Strings:
set "var=blubb"
if "%var%" gtr "affe" echo größer
Aber...
set "var=2"
if "%var%" gtr "10" echo größer
Hier wird der String "2" mit dem String "10" verglichen und da hat das Zeichen 2 einen höheren Wert als das Zeichen "1" in "10"
Bei Zahlenvergleichen in Batch muss sichergestellt sein, das die Variable(n) nicht Leer ist/sind, sonst fehlt dem if-vergleich ein Argument (Syntaxfehler) :
set "var=" &rem Variable löschen/leeren
if %var% gtr 10 echo größer
Wird wiefolgt interpretiert:
if gtr 10 echo größer
...ist natürlich falsch.
Strings ist das egal, da diese Quotes gehalten werden sollten.
if "" gtr "Affe" ...
Batch ist nicht wirklich praktisch, wenn es um Zahlen geht. Vergleiche funktionieren nur bis 2147483647 größere Zahlen werden falsch bewertet.
Countdown/up und Berchnung Minuten Sekunden
demo.cmd
@echo off
chcp 65001 >nul
:nochmal
set /p input="Gebe Sekundenanzahl an: "
set /a "testsec=input" &rem set /a braucht keine %% um variablennamen , nicht numerische Werte sind automatisch 0
if "%testsec%" neq "%input%" (
echo Die Eingabe war keine Zahl
goto :nochmal
)
echo Drücke eine beliebige Taste um den Zähler zu beschleunigen
echo abwärts
for /l %%a in (%testsec%,-1,0) do (
call :outputMinSec %%a &rem Schleifenzähler %%a an Subroutine übergeben
timeout 1 >nul
)
echo aufwärts
for /l %%a in (0,1,%testsec%) do (
call :outputMinSec %%a
timeout 1 >nul
)
pause
exit /b
:outputMinSec %1=Sekunden
set /a "Minuten=%1 / 60"
set /a "Sekunden=%1 %% 60" &rem Modulo (Rest von Division) durch 60
echo %Minuten% Minuten %Sekunden% Sekunden
Batch kann normalerweise innerhalb des Schleifenrumpfes gesetzte Variablen nicht im Schleifenrumpf verwenden, deshalb die Operationen in Subroutinen auslagern.
oder Verzögerte Variablenexpansion verwenden:
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
:nochmal
set /p input="Gebe Sekundenanzahl an: "
set /a "testsec=input" &rem set /a braucht keine %% um variablennamen , nicht numerische Werte sind automatisch 0
if "%testsec%" neq "%input%" (
echo Die Eingabe war keine Zahl
goto :nochmal
)
echo Drücke eine beliebige Taste um den Zähler zu beschleunigen
echo abwärts
for /l %%a in (%testsec%,-1,0) do (
set /a "Minuten=%%a / 60"
set /a "Sekunden=%%a %% 60"
echo !Minuten! Minuten !Sekunden! Sekunden
timeout 1 >nul
)
echo aufwärts
for /l %%a in (0,1,%testsec%) do (
set /a "Minuten=%%a / 60"
set /a "Sekunden=%%a %% 60"
echo !Minuten! Minuten !Sekunden! Sekunden
timeout 1 >nul
)
pause
ist deine variable denn auch ein zahlentyp oder ein string (text) dann klappen größer und kleiner operatoren natürlich nicht :)
Falls du meinst ob ich die Variablen mit set /a gemacht habe, ja. aber da ich keine Ahnung mehr hab, hier der code:
@echo off
color 0a
cls
title Timer
set /p test="Gebe Sekundenanzahl an: "
set /a testsec=%test%
:a
cls
color 0a
if %testsec% GEQ 60 goto unter60
:next
echo %testmin% Minuten und %testsec% Sekunden verbleibend
set /a test=%test%-1
set /a testsec=%test%
set /a testmin=%test%/60
timeout 1 > nul
if %test% == 0 goto ende
goto a
:ende
color 0c
cls
echo Timer erreicht
pause > nul
:unter60
set %testsec%=%testsec%-60
if %testsec% lss 60 goto next
goto :unter60
Der Schräge ist mein Problem und sollte ursprünglich verhindern das die Sekundenanzahl über 60 geht
Ich weiß dass selbst das Grundkonzept nicht optimal ist, aber ist nur um mal wieder rein zu kommen