Probleme mit Batch-Skript - If-Verschachtelung
Ich habe folgendes Batch-Skript geschrieben:
Die erste If-Bedingung wird einwandfrei ausgewertet und die Anweisungen werden ausgeführt. Die zweite If-Bedingung wird jedoch nicht ausgeführt und ich bekomme nicht heraus, woran dies liegen könnte. Kann mir jemand helfen bzw. zeigen, ob und wo sich evtl. ein Fehler eingeschlichen hat?
Setlocal enabledelayedexpansion
Set /A h1 = 12
Set /A m1 = 10
Set /A h2 = 14
Set /A m2 = 50
If %h2% GTR %h1% (
Set /A h = %h2% - %h1% -1
Set /A m = 60 - %m1% + %m2%
If "%m%" GEQ 60 (
Set /A m = %m% - 60
Set /A h = %h% + 1
)
) Else (
Set /A h = 0
Set /A m = %m2% - %m1%
)
Echo %h% Stunde(n) und %m% Minuten
pause
Die erste If-Bedingung wird einwandfrei ausgewertet und die Anweisungen werden ausgeführt. Die zweite If-Bedingung wird jedoch nicht ausgeführt und ich bekomme nicht heraus, woran dies liegen könnte. Kann mir jemand helfen bzw. zeigen, ob und wo sich evtl. ein Fehler eingeschlichen hat?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2946822452
Url: https://administrator.de/contentid/2946822452
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
5 Kommentare
Neuester Kommentar
Meinst du das "sonstige Systeme" die richtige Foren Rubrik ist?? Entwicklung - Batch&Shell wäre sicher sinnhafter. (Der "Bearbeiten" Knopf lässt dich das immer auch nachträglich korrigieren!)
Ein Hinweis welche Shell würde zusätzlich helfen.
Wie Du eine Frage richtig stellst
Ein Hinweis welche Shell würde zusätzlich helfen.
Wie Du eine Frage richtig stellst
Moin,
Um das zu ändern, musst du entweder die Variablenverzögerung nutzen (aktiviert hast du diese ja mit setlocal enabledelayedexpansion bereits):
... oder du nutzt statt der Gruppierung Funktionen & call
Gruß Thomas
Zitat von @ulrker:
Die erste If-Bedingung wird einwandfrei ausgewertet und die Anweisungen werden ausgeführt. Die zweite If-Bedingung wird jedoch nicht ausgeführt und ich bekomme nicht heraus, woran dies liegen könnte. Kann mir jemand helfen bzw. zeigen, ob und wo sich evtl. ein Fehler eingeschlichen hat?
wenn du einen Code mit Klammern gruppierst, gilt diese Gruppierung als 1 Befehl. Wenn du eine Variable innerhalb einer Gruppierung aufrufen möchtest, wird dir immer der Wert ausgegeben, den die Variable vor der Gruppierung hatte - in deinem Fall ist die Variable "m" daher noch nicht definiert.Die erste If-Bedingung wird einwandfrei ausgewertet und die Anweisungen werden ausgeführt. Die zweite If-Bedingung wird jedoch nicht ausgeführt und ich bekomme nicht heraus, woran dies liegen könnte. Kann mir jemand helfen bzw. zeigen, ob und wo sich evtl. ein Fehler eingeschlichen hat?
Um das zu ändern, musst du entweder die Variablenverzögerung nutzen (aktiviert hast du diese ja mit setlocal enabledelayedexpansion bereits):
Setlocal enabledelayedexpansion
Set /A h1 = 12
Set /A m1 = 10
Set /A h2 = 14
Set /A m2 = 50
If %h2% GTR %h1% (
Set /A h = %h2% - %h1% -1
Set /A m = 60 - %m1% + %m2%
If !m! GEQ 60 (
Set /A m = !m! - 60
Set /A h = !h! + 1
)
) Else (
Set /A h = 0
Set /A m = !m2! - !m1!
)
Echo %h% Stunde(n) und %m% Minuten
pause
... oder du nutzt statt der Gruppierung Funktionen & call
Set /A h1 = 12
Set /A m1 = 10
Set /A h2 = 14
Set /A m2 = 50
If %h2% GTR %h1% (call :wahr) else (call :falsch)
Echo %h% Stunde(n) und %m% Minuten
pause
:: HIER FOLGEN DIE FUNKTIONEN ::
goto :EoF
:wahr
Set /A h = h2 - h1 -1
Set /A m = 60 - m1 + m2
If %m% GEQ 60 (
Set /A m = m - 60
Set /A h = h + 1
)
goto :EoF
:falsch
Set /A h = 0
Set /A m = m2 - m1
Gruß Thomas
Jetzt noch Zeile 9 die Anführungszeichen raus.
Dann kommen auch die (vermutlich) gewünschten 2 Stunden 40 raus...
/pp
@TK1987 das mit ohne Variablenzeichen war mir auch neu, wieder was gelernt. THX
Setlocal enabledelayedexpansion
Set /A h1 = 12
Set /A m1 = 10
Set /A h2 = 14
Set /A m2 = 50
If %h2% GTR %h1% (
Set /A h = %h2% - %h1% -1
Set /A m = 60 - %m1% + %m2%
If !m! GEQ 60 (
Set /A m = !m! - 60
Set /A h = !h! + 1
)
) Else (
Set /A h = 0
Set /A m = !m2! - !m1!
)
Echo %h% Stunde(n) und %m% Minuten
pause
/pp
@TK1987 das mit ohne Variablenzeichen war mir auch neu, wieder was gelernt. THX
Moin,
Gruß Thomas
Zitat von @PeterPanter:
@TK1987 das mit ohne Variablenzeichen war mir auch neu, wieder was gelernt. THX
ich muss diese Aussage allerdings korrigieren: Für set /a werden keine Variablenzeichen benötigt, soweit korrekt - das if-Statement benötigt diese jedoch. Somit kommt man hier ohne Variablenverzögerung eh nicht aus (ausser mittels Funktionen).@TK1987 das mit ohne Variablenzeichen war mir auch neu, wieder was gelernt. THX
Gruß Thomas