"If greater than" in Batch?

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  22.01.2022, 16:58

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 
0
HILFEEEEEE613 
Fragesteller
 22.01.2022, 17:05

Perfekt danke

0

ist deine variable denn auch ein zahlentyp oder ein string (text) dann klappen größer und kleiner operatoren natürlich nicht :)

HILFEEEEEE613 
Fragesteller
 22.01.2022, 15:37

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

0