ulrker
Goto Top

Probleme mit Batch-Skript - If-Verschachtelung

Ich habe folgendes Batch-Skript geschrieben:
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?

bat-datei time

Content-ID: 2946822452

Url: https://administrator.de/contentid/2946822452

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

148523
148523 31.05.2022 aktualisiert um 13:26:56 Uhr
Goto Top
Meinst du das "sonstige Systeme" die richtige Foren Rubrik ist?? Entwicklung - Batch&Shell wäre sicher sinnhafter. face-wink (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
TK1987
TK1987 31.05.2022 aktualisiert um 14:19:20 Uhr
Goto Top
Moin,

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.

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
PeterPanter
PeterPanter 31.05.2022 aktualisiert um 14:01:18 Uhr
Goto Top
Jetzt noch Zeile 9 die Anführungszeichen raus.
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
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
TK1987
TK1987 31.05.2022 aktualisiert um 14:04:53 Uhr
Goto Top
Moin,

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).

Gruß Thomas
ulrker
ulrker 31.05.2022 um 14:35:51 Uhr
Goto Top
Vielen herzlichen Dank, funktioniert prima mit Version 1

Gruß

Ulk