nagus
Goto Top

If - If mit anschließendem goto funktioniert nicht

Moin, ich bins schon wieder face-sad

Ich kämpfe mit einer doppelten IF abfrage und anschließendem GOTO.

stark abgespeckt sieht das Script so aus:

rem @echo off
color 1F

set manuell=no
if /I %manuell% EQU NO goto Var10
set/A Var10=0
set/A Var12=1

:Var10
REM +++++++++++++++++++++++++++++++ Var 10 +++++++++++++++++++++++++++++++++++++++++
if /I %manuell%==yes if %Haus10%==0 (goto Var12)
pause
goto ende

:Var12
REM +++++++++++++++++++++++++++++++ Var 12 +++++++++++++++++++++++++++++++++++++++++
echo Var12
pause
goto ende

:ende

Wenn manuell auf YES gesetzt ist läuft das sauber durch. Sobald ich das jedoch auf NO setze bekomme ich die Fehlermeldung (goto wäre an dieser Stelle syntaktisch nicht verarbeitbar.
Irgendwie mache ich bei der Verschachtelung einen Fehler und ich bekomme den nicht in den Griff. Ich stehe auf den Schlauch. Wenn ich alles für NO optimiere läuft nacher bei YES nix mehr ...

Was ist mein Fehler?

Viele Grüße
Nagus

Content-Key: 158155

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: mathe172
mathe172 Jan 07, 2011 at 08:40:29 (UTC)
Goto Top
Hallo Nagus!

So wie es ausschaut ist die Variable %Haus10% in Zeile 11 leer - Versuch mal die If-abfrage so zu machen:
If /I "%manuell%"=="yes" if "%Haus10%"==0 (goto :Var12)  
Die " bewirken, dass nie eine Seite des Vergleichs leer ist - dann spinnt nämlich das If

Mathe172
Member: pieh-ejdsch
pieh-ejdsch Jan 07, 2011 at 08:55:45 (UTC)
Goto Top
moin Nagus,

...bekomme ich die Fehlermeldung (goto wäre an dieser Stelle syntaktisch nicht verarbeitbar...
da ist entweder die Variable %Haus10% oder %Manuell% nicht gesetzt ich tendiere auf %Haus10%
das mag ja zum Testen in der CMD-Line gehen und keinen syntatischen Fehler hervorrufen, aber in der CMD-Line werden nicht gesetzte Variablennamen mit Prozent drumrum dargestellt siehe Umgang mit Variablen
vom Batch-Parser wird ja erst die komplette Zeile eingelesen daher der Fehler

gestalte Deine Vergleiche mal so
if /i "%manuell%" EQU "NO" goto :Var10  
....
if "%Haus10%"=="0" goto :Var12  
eine Klammer brauchst Du nur wenn mehrere Anweisung als eine Zeile angesehen werden sollen oder vor der else Klausel

[edit] mathe war schneller ...[/edit]

Gruß Phil
Member: jeb-the-batcher
jeb-the-batcher Jan 07, 2011 at 09:50:40 (UTC)
Goto Top
Moin,

oder mit Delayed Expansion arbeiten, dann klappt es auch ohne Anführungszeichen, egal was oder ob überhaupt was in der Variabel drin ist.
if /i !manuell! EQU NO goto :Var10
if !Haus10!==0 goto :Var12

Gruß
jeb
Member: Nagus
Nagus Jan 07, 2011 at 12:18:02 (UTC)
Goto Top
Erstmal Danke für die Antworten!

Die Zeile
If /I "%manuell%"=="yes" if "%Haus10%"==0 (goto :Var12)  

war nicht ganz korrekt sondern richtig wäre gewesen - da habe ich gepennt ...
If /I "%manuell%"=="yes" if "%Var10%"==0 (goto :Var12)  

Hat aber kein Ergebnis auf das Script gehabt der Fehler kam noch immer ...

Tatsächlich hat jebs Lösung gezogen
if /I !manuell!==yes if !Haus10!==0 goto Var12

Verstehen tue ich es aber nicht!
Ich habe alle Variablen beim Start mit Werten versehen!

set manuell=no
...
REM +++++++++++ eine Einrichtung wird mit 1 aktiviert bsp.: set/a var10=1 +++++++++++
set/A var10=0
set/A var12=0
set/A var14=0
...
:var10
If /I "%manuell%"=="yes" if "%Var10%"==0 goto :Var12  

...
:var12
...

was ist daran falsch? Wieso mault er immer goto wäre an dieser Stelle syntaktisch falsch?
grummel

Aber jetzt läuft es - und ich habe noch ein paar andere Fehler gefunden -.-

Deswegen nochmal Danke für Eure Hilfe!

Nagus
Member: miniversum
miniversum Jan 07, 2011 at 13:19:42 (UTC)
Goto Top
Du solltest beim zuweisen von Werten darauf achten das diese keine Leerzeichen danach enthalten, sonst gibts Probleme.
set manuell=no -> set "manuell=no"
set/A var10=0 -> set /A "var10=0"

Vergleiche funktionieren "besser" wenn beide Seiten in Anführungszeichen sind:
if "%Var10%"==0 -> if "%Var10%"=="0"
Es können beim == Probleme entstehen wenn Leerzeichen am Anfang oder am Ende enthalten sind. Daher nehme ich für vergleiche immer equ:
If /I "%manuell%"=="yes" -> If /I "%manuell%" equ "yes"

Allgemein:
Ich finde es etwas "schwierig" Variablen und Sprungmarken die gleichen Namen zu geben.

Für die Fehlersuche kannst du ja die Zeile:
If /I "%manuell%"=="yes" if "%Var10%"==0 (goto :Var12)
aufteilen in:
If /I "%manuell%"=="yes" (
if "%Var10%"==0 (
goto :Var12
)
)
Member: Nagus
Nagus Jan 07, 2011 at 13:33:33 (UTC)
Goto Top
Hi miniversum,

Danke für die Tipps!

Das die Sprungmarken und Variablen gleich sind ist aus einem Denkfehler heraus entstanden. Dass muss ich irgendwann mal korrigieren - wenn das Script sauber läuft face-smile
Viele Grüße
Nagus
Member: jeb-the-batcher
jeb-the-batcher Jan 07, 2011 at 13:39:49 (UTC)
Goto Top
Hallo Nagus,

wie miniversum schon geschrieben hat, sollte man beide Seiten eines Vergleich "gleich" halten.

In deinem Beispiel also if "%Var10%"=="0" (goto :Var12)
weil Zeichenweise verglichen wird. Also hinteher "0" mit "0".
Bei deinem Code wurde aber "0" mit 0 verglichen, was niemals gleich sein kann.

Gruß
jeb