Batch Sprungmarke fehlerhaft?
Ich habe eine Batch erstellt (ca. >500 Zeilen).
Nun bin ich bei dieser relativ simplen "Programmiersprache" auf ein Phänomen gestoßen, das mich sehr verwundert.
Ich habe eine IF-Abfrage, die einwandfrei funktioniert. Darin steht am Ende: "... && GOTO makelanmess" Danach kommen nach einer weiteren Sprungmarke weitere Zeilen Code und dann die Zielmarke.
Wenn beim Ausführen die IF abfrage als true bewertet wird geht das Programm zu.
Jetzt könnte man sagen dass mein IF Sytax fehlerhaft ist, aber wenn ich die Ziel-Sprungmarke doppelt hinschreiben, dann geht es. Also stürzt das Programm ab, da es kein Sprungziel sieht.
Wenn ich es über eine "Zwischenmarke" ( sprich : if->marke 1->Marke 2( Ziel ))umleite, dann geht es. Das Problem besteht nur, wenn sie aus der If abfrage aufgerufen werden soll.
Nun, ich habe schon rund um die Sprungmarke alle (unsichtbaren) Zeichen gelöscht und diese an verschiedene Stellen geschrieben. Es funktioniert nur wenn diese doppelt da steht. Dieses Problem habe ich jetzt schon 2 mal im File und es stört mich, da ich nicht weiss ob das in Zukunft vom System noch geschluckt werden kann.
Hat jemand schon Erfahrung mit einem solchen Fehler
1 Antwort
Kann nicht sein.
Wenn man eine Batch mit 500 Zeilen "gebaut" hat , läuft mit der organisation des Codes irgendwas schief.
Es wäre mühselig eine Batch von 500 Zeilen zu schreiben, deshalb habe ich auf die schnelle eine Batch geschrieben, welche eine solche TestBatch (mit 1000 Zeilen bis zum Label) automatisch generiert und aufruft...
@echo off
echo generiere 1000 Zeilen Code
echo set "testVar=1">"test.cmd"
echo if "%%testVar%%"=="1" goto :MyLabel>>"test.cmd"
for /l %%a in (1,1,1000) do (echo echo Zeile %%a vor Label)>>"test.cmd"
echo pause>>"test.cmd"
rem generiere label
echo :MyLabel>>"test.cmd"
echo echo nach label>>"test.cmd"
rem rufe generiertte Batch auf
call "test.cmd"
pause
...wie gewünscht wir das Label direkt angesprungen. Weder die 1000 Zählzeilen noch Pause wird ausgeführt...
was dein doppeltes Ampersand && bewirken soll weiß ich nicht, da ich den vorangeghenden Befehl nicht kenne.
&& führt den folgenden Befehl nur aus, wenn Errorlevel = 0 ist. Für eine unbedingte Ausführung einer Befehlskette in einer Zeile verwendet man ein einfaches Ampersan& .
https://ss64.com/nt/syntax-redirection.html
rem erzwinge errorlevel 1 und entscheide
(call) && (echo kein Fehler) || (echo Fehler)
echo Errorlevel=%errorlevel%
rem setze errorlevel 0 ( Leerzeichen nach Leercall löscht Errorlevel) und entscheide
(call ) && (echo kein Fehler) || (echo Fehler)
echo Errorlevel=%errorlevel%
pause
Okay, du musst dann in Zeile 438 oder so den auskommentierten Text entfernen, damit der Fehler provoziert werden kann.
Damit du da hinkommst musst du das Programm erst einrichten. Wenn du in der Konsole bist gibst du /messenger ein. Dann wird dir alles erklärt. Als Pfad kannst du deinen Desktop angeben. Wenn das Programm eingerichtet ist musst du nur /messenger ein damit du an die fehlerhafte Stelle gelangst.
...Ich liebe solchen Spagetticode 🙄
Alles konnte ich nicht fixen... (ganz Nebenbei treibst du einfach zuviel Aufwand um ein Paar Variablen zu speichern... und auch das Schreiben einer 2. batch ist unnötig.
@echo off
chcp 65001 >nul & rem Ümlaute und Unicode anzeigen
rem hier alles initialisieren, was beiden Batches gemeinsam ist
set "demoVar=blubb"
set "oldnum=0"
set "self.num=0"
set "self.text="
echo ich werde in beiden Batchteilen angezeigt...
rem entscheiden welcher batchteil ausgeführt wird
if "%1"=="second" goto batchTeil2
:batchTeil1
title Rumpelheinz
rem speichere alle Variablen welche mit self. beginnen in eine Datei
set self.>"data.txt"
set /p "demoVar2=gib was ein : "
rem dieser Batchteil startet diese Batch nochmal mit dem parameter second
rem %~f0 ist die Variable für den vollen Pfad der Batch
start "" cmd /c "%~f0" second
echo ich bin Code in Batch1
:loop
set /a "self.num+=1"
set /p "self.text=sende was : "
rem Datei updaten
set self.>"data.txt"
goto loop
pause
exit /b
:batchTeil2
title Murmelprinz
echo ich bin Code in Batch2
set demoVar
echo warte auf Daten....
:loop2
rem Variablen aus Speicherdatei einlesen
if exist "data.txt" for /f "usebackq tokens=*" %%a in ("data.txt") do ( set "%%a" )
if %self.num% gtr %oldnum% (
echo %self.num% text: %self.text%
set "oldnum=%self.num%"
)
for /l %%. in (1,1,5000) do (call )
goto loop2
pause
exit /b
Ich kann dir den dpwnload zum file schicken. Inzwischen habe ich herausgefunden dass man auch eine auskommentierte Zeile nehmen kann. Ich vermute der file ist an der Stelle fehlerhaft.