90957
Goto Top

If Verschachtelung - Wie weit kann mans treiben?

Hallo Leute,
ich habe mal eine ganz simple Frage.

Ich habe festgestellt dass Batch ab einer bestimmten Menge
ineinander Geschachtelter IF-Abfragen abschmiert.
Ich ich habe ausser dem auch festgestellt, dass wenn man zu viele Befehle
inerhalb eines "IFs" plaziert, das Batch Skript abschmiert.
(Beides kann man allerdings verhindern in dem man einfach die Befehle
per Call :einsprungpunkt auslagert.)

Ich würde gerne wissen ob jemand weiß unter welchen Umständen ein Fehlerfreies
Batch-Skript inerhalb einer IF-Abfrage aussteigt.
Bzw. bei welcher Anzahl von Zeilen/Befehlen/Weiteren IF-Abfragen/Zeichen...

Rund um ... An welche Faktoren diese Abstürze gebunden sind.

Ich weiß, durch laaaaanges rumprobieren könnte ich dass VIELEICHT auch herausfinden,
aber ich habe nicht die Zeit und die Muße da rum zu probieren.

Ich verlange auch nicht dass sich jetzt jemand anders hinsetzt und das für mich
macht, sondern ich hoffe einfach dass jemand das schon irgendwoher weiß
und so nett ist sein Wissen mit mir zu teilen.

Gruß
BluBb_mADe

Content-ID: 157539

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

Ausgedruckt am: 21.11.2024 um 23:11 Uhr

pieh-ejdsch
pieh-ejdsch 24.12.2010 um 16:59:52 Uhr
Goto Top
moin BluBb_mADe,

ich bin bisher noch nicht an irgendwelche Grenzen von von Schleifenverschachtelungen gestoßen.

der einzige Nachteil ist, das man nicht auf den ersten Blick nachvollziehen kann, wo der Fehler bzw. die Fehlerhafte Proggrammierung vorliegt - wegen der Klammer die diese Befehle zu einer BefehlsZeile zusammenfasst.
bau genug "Echo's" und "Rem's" ein damit Du den Fehler genauer eingrenzen kannst.
und lass das ganze mit "@echo on" laufen.

wieviele IF - Schleifen hast Du denn verschachtelt?
Gruß Phil
90957
90957 24.12.2010 um 17:37:09 Uhr
Goto Top
Wenn du ein Batch-Programm (ja ich weiß eigentlich ist es nur ein skript)
mit über 1400 Zeilen hast (ja ich weiß ich bin verrückt)
dann nervt es schon wenn du in jeder zweiten Sub (so verwende ich meißt einsprungpunkte)
irgend ein Teil ausgelagern musst...
Ich hab ja schon gesagt, dass ich es mit viel versuchen möglicher weise herausfinden kann.
Aber das dauert vermutlich ewig...
Ich bekomme diesen Fehler schon bei über 5 längeren Zeilen innerhalb einer IF-Schleife...
und bei über 2 verschachtelungen also:

set a=5
set x=5
set y=5
set z=5
IF %x%==%y% (
   IF %y%==%z% (
      IF %a%==%x% (
         echo blablablablablablalangertext
         echo über mehrere zeilen
         echo als zeichen dass es nicht geht.....
         echo fragt nicht, das macht keinen sinn...
      )
   )
)
funktioniert bei mir manchmal schon nicht mehr.
(Das ist nur ein Beispiel, so verwende ich das natürlich nicht!!!)

Gruß
BluBb_mADe
pieh-ejdsch
pieh-ejdsch 24.12.2010 um 21:09:51 Uhr
Goto Top
versuch doch mal
if "%x%" == "%y%" (....  
also die Variablen mit Doppeltem Hochkommata umschliessen und zwischen den Vergleichen und dem == auch jeweils ein Leerzeichen einfügen.
sonst - falls eine dieser Variablen im Vergleich nicht gesetzt ist (oder Leerzeichen; einige Sonderzeichen enthält) fasst IF in die Grütze.

Gruß Phil
90957
90957 24.12.2010 um 22:27:23 Uhr
Goto Top
Also ich poste jetzt erstmal ein Beispiel Programmschnipsel der net funktioniert:

If "%var1%"=="%var2%" (  
	echo aktuell
) else (
	if exist "file" (  
		ren file file.backup
	)
	wget -q -t 10 -N http://xxxxxxxxxxxx.xx/file
	if exist file (
		del flile.backup
		for /L %%i in (1,1,5) do (
			echo !var1!+%%i
			if "!var3!" == "!var1!+%%i" (  
				echo stimmt
			)
		)
		echo Erfolgreich auf  "!var2!" aktualisiert.  
	) else (
		ren file.backup file
		echo Fehler bei der Aktualisierung.
	)
)

Wie ich bereits schon erwähnt habe ist das Programm über 1400 "Zeilen" lang...
Ich habe solche spielereien durchaus beachtet und ich kann dir sagen:
Es funnktioniert, wenn ich es auslagere!!!

Also wenn ich den selben Code per "Call" aufrufe funktioniert er...
Das hatte ich auch schon oben erwähnt...
Trotz dem danke für deine Mühen

Gruß

BluBb_mADe

*Edit:
bin mal wieder auf ein solches Proble, gestoßen:
if not "%vara%" == "" (  
	echo alt: "%vara%"  
	echo neu: "%varb%"  
) else (
	echo alt: ist Defekt oder fehlt.
	echo neu: "%varb%" wird jetzt Installiert...  
	echo.
)
pause
..warum stürzt mein Skript dabei ab???
jeb-the-batcher
jeb-the-batcher 25.12.2010 um 19:37:30 Uhr
Goto Top
Hallo BluBb-mADe,

erstens würde ich auf Delayed Expansion wechseln, da die viele Probleme umgeht.
z.B. Wenn in %vara% oder %varb% eine Klammer ) oder Hochkomma " drin ist, hat dein Skript sonst Probleme.

Bei deinen Skripten tritt bei mit kein Fehler auf, dazu müßte man mal die entsprechenden Inhalte der Varibalen sehen.

Weihnachtliche Grüße
jeb
pieh-ejdsch
pieh-ejdsch 25.12.2010 um 19:41:30 Uhr
Goto Top
moin,

steckt in vara oder varb eine ungerade Zahl doppelter Hochkommata (oder bei gerader Anzahl Hochkommata und dazwischen etwas wie & > < | etc ) solltest Du die Variable verzögert ausgeben - Du nutzt ja auch DelayedExpansion in dem Teil oder diese SonderZeichen Escapen mit ^.

hast Du mal die Batch ins CMD-Fenster gezogen um etwaige Meldungen lesen zu können?
zB. "..." kann syntaktisch an dieser Stelle nicht verarbeitet werden.

was steht in var3?

ist es nicht besser nach dem
wget ... ein &&( mache das auch )||(mache das als ersatz)
einzufügen?

[Edit] etwas zu spät [/Edit]

Gruß Phil
90957
90957 25.12.2010 um 21:15:06 Uhr
Goto Top
Tachchen,
in allen Variablen stecken ausschließlich strings aus zahlen und/oder kleinbuchstaben
(oder sie sind leer)!!!
das habe ich schon durch ca. 100 echos überprüft!
(ich habe mir schon nach jeder zeile alle variablen in "" ausgeben lassen)
und ich habe (wie oben schon 2 mal erwähnt) festgestellt:
wenn ich tief verschachtelte teile des codes auslagere, arbeiten sie einwandfrei.

hast Du mal die Batch ins CMD-Fenster gezogen um etwaige Meldungen lesen zu können?
Danke, da bin ich noch gar nicht drauf gekommen!

bei:
war ich mir nicht sicher ob das mit wget richtig funktioniert, da ich keine original wget.exe verwende sondern ein "alles in einer exe" wget.

...der fehler im zweiten schnipsel ensteht anscheinden in zeile 7 und die fehlermedlung lautet:
batch datei nicht gefunden
???
ich glaube irgendwas an meinem system hat was auf n deckel bekommen.
der drag and drop debugging trick is trotz dem super praktisch...
(da hätt ich echt selber drauf kommen müssen ._.)

Ich markier mal als gelöst, da ihr ja nicht mal den fehler reproduzieren könnt...

da muss ich wohl mein system erst mal flicken
(was auch immer da nicht stimmt...)

Trotz allem vielen Danke für die Antworten

und noch ein par schöne Festtage

Gruß
BluBb_mADe
pieh-ejdsch
pieh-ejdsch 25.12.2010 um 21:41:34 Uhr
Goto Top
in allen Variablen stecken ausschließlich strings aus zahlen und/oder kleinbuchstaben
(oder sie sind leer)!!!

dazu
If "%var1%"=="%var2%" (
	echo aktuell
) else (....
wenn Beide Variablen Leer sind wird "echo aktuell" ausgeführt.

dann eher
if defined var1 If "%var1%"=="%var2%" (
	echo aktuell
) else (....

bei:
wget ... war ich mir nicht sicher ...
sollte mit anderen Versionen auch funktionieren wenn bei Fehlern Error-codes oder -Meldungen ausgegeben werden

Gruß Phil
jeb-the-batcher
jeb-the-batcher 25.12.2010 um 21:52:48 Uhr
Goto Top
Wenn der Fehler in Zeile 7 echo. auftritt, dann liegt einfach eine Datei namens "echo" im Verzeichnis rum.

Daher nehme ich immer echo(, damit passiert das nicht und ist zusätzlich auch schneller, weil gar nicht erst auf der Platte nach einer "ECHO"-Datei gesucht wird.

Gruß
jeb
90957
90957 25.12.2010 um 23:05:00 Uhr
Goto Top
@pieh-ejdsch
es sind niemals beide Variablen leer!
Denn falls var1 leer ist wird sie mit "Leer" gefüllt...vorher schon.
(und sogar wenn, kann auch das nicht zu einem Fehler führen!
es würde in diesem Fall ein Update nicht installiert, das ist nicht tragisch und dürfte auch nicht zu einem Absturz führen!)
und definiert sind beide Variablen sowieso da ich sie garantiert
irgendwo schon mal verwendet haben!
(ich setze sie aber vor erneutem gebrauch immer set "var1=" (oder eben "Leer"))
Gerade durchgetestet...bei meiner wget.exe wird der errorlevel nicht gesetzt!!!
ich habe allen "grafischen" Ausgaben per Parameter unterbunden
(die exe lässt sich per >NUL oder ähnlichem leider nicht abfangen)

@jeb-the-batcher
es existiert keine Datei namens "echo"!!!
ich habe das gerade getestet falls wärend eines "echo." eine Datei namens echo existiert erhällt man den Fehler:
"Der Befehl "ech" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
Oder es sollte sich der Standart Editor für die Datei öffnen...
aber wieso sollte die "echo" datei als batch datei erkannt werden
1.
habe ich KEINEN Aufruf per "start" verwendet
2.
ich habe keinen Aufruf per "call" verwendet

"echo( "
verwende ich jetzt trotz dem :D
warum funktioniert das eigentlich?

und jetzt will ich hiermit noch mal allgemein auf meine ursprüngliche Fragestellung hinweisen!

Gruß
BluBb_mADe
jeb-the-batcher
jeb-the-batcher 26.12.2010 um 09:47:53 Uhr
Goto Top
Zitat von @90957:
@jeb-the-batcher
es existiert keine Datei namens "echo"!!!
ich habe das gerade getestet falls wärend eines "echo." eine Datei namens echo existiert erhällt man den
Fehler:
"Der Befehl "ech" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
Oder es sollte sich der Standart Editor für die Datei öffnen...
aber wieso sollte die "echo" datei als batch datei erkannt werden
1.
habe ich KEINEN Aufruf per "start" verwendet
2.
ich habe keinen Aufruf per "call" verwendet

"echo( "
verwende ich jetzt trotz dem :D
warum funktioniert das eigentlich?

Ich glaube das "echo." nicht als Batch-Datei erkannt wird, es läuft schlicht nicht.
Warum das "echo(" funktioniert, liegt vermutlich daran, dass der BatchLineParser die öffnende Klammer erkennt und entfernt (in Phase2).
Aber die Zeile als "nicht leer" markiert, oder so ähnlich.

Zu deiner eigentlichen Frage:
Man kann mindestens 40 IF-Blöcke ineinander Schachteln ohne Probleme, der Inhalt kann >66kB groß sein.
Genau genommen habe ich keine Grenze bis jetzt gefunden.

Das scheint also nicht dein Code-Problem zu sein, dass kann eigentlich nur in deinen Variablen liegen.

Grüße
jeb
90957
90957 26.12.2010 um 12:38:23 Uhr
Goto Top
Ich glaube dann ist die größe das Problem.
Meine Batch Datei ist schon weit über 70 kb groß!
Und ich verwende massig Einsprungpunkte, die bei einer
so großen Datei warscheinlich nicht gefunden werden.
Deshalb kann es vermutlich dann auch zu den Fehlern im IF
kommen, weil Variablen gar nicht erst gesetzt werden
da der dafür notwendige Einsprungpunkt nicht gefunden wird.
Das mit der "echo" Datei habe ich extra ausprobiert!
Es entsteht dadurch tatsächlich ein Fehler, der jedoch nicht
zum Absturz des Skriptes führt.
Den Absturtz an dieser stelle im Code konnte ich mit "echo(" nicht
verhindern.
Ich verwende es jetzt trotz dem,
da du von einer Beschleunigung gesprochen hast
was ganz plausibel klang...

Vielen Dank für die Hilfestellungen und informationen!

Gruß

BluBb_mADe
rubberman
rubberman 26.12.2010 um 17:46:30 Uhr
Goto Top
Hallo BluBb_mADe.

Wie tief man IFs verschachteln kann, habe ich eben mal kurz getestet.
@echo off &setlocal

set /a x=1, y=1184
>"test.bat" type nul  

for /l %%i in (%x%,1,%y%) do (
  echo(schreibt 1. Haelfte %%i
  >>"test.bat" echo(if %%x%%==%x% (  
)

>>"test.bat" echo(echo(FUNKTIONIERT  

for /l %%i in (%x%,1,%y%) do (
  echo(schreibt 2. Haelfte %%i
  >>"test.bat" echo(^)  
)

cls
echo(Aufruf "test.bat"  
call "test.bat"  
pause
Während y=1184 noch funktioniert, meldet sich mein Win7 Starter bei 1185 mit der Message "Windows-Befehlsprozessor funktioniert nicht mehr".

BTW Aus Erfahrung reicht ein ECHO %var% nicht aus, um festzustellen, welchen Wert eine Variable tatsächlich hat.
Verschiedene Tools geben merkwürdige Zeilenumbrüche, wie etwa 0D 0D 0A aus, die bei der weiteren Verarbeitung zu den merkwürdigsten Fehlern führen können. Prüfen kannst du das im Grunde nur, indem du die Ausgabe des Tools in eine Datei umleitest und diese mit einem Hex Editor prüfst. Die Auslagerung entsprechender Sequenzen hilft hier, weil evtl. enthaltene überflüssige 0D (Carriage Return) Zeichen dann durch den Interpreter entfernt werden. Siehe Die Geheimnisse des Batch Zeilen Interpreters Phase1.

Ich schließe mich also der Vermutung von jeb an, dass du (entgegen dem Anschein bei der ECHO Ausgabe) Steuerzeichen in der Variable hast, die den Abbruch provozieren.

Grüße
rubberman
mathe172
mathe172 26.12.2010 um 17:53:15 Uhr
Goto Top
Hallo BluBd_mADe!

Wenn du wirklich soviel "Subs" wie beschrieben hast, lagere die doch in externe Dateien aus
[edit: Es geht auch mit call. Dann kann die echo-Zeile in "Sub.bat weg, und die Variable werden dann automatisch auch in der ausgangsbatch gesetzt."]
Also etwa:
REM Das ist die Ausgangsdatei
set a=10
set b=5
call :Sub
echo %x%
echo %y%
pause

:Sub
set /a x=a*b
set /a y=a/b
goto :eof
Wird zu...
REM Sub.bat:
set /a a=%~1*%~2
set /a b=%~1/%~2
echo(%a% %b%
und...
REM Kleinere batch:
set a=10
set b=5
for /F "tokens=1,2" %%A in ('Sub.bat %a% %b%') do set x=%%A & set y=%%B  
echo %x%
echo %y%

Mathe172
jeb-the-batcher
jeb-the-batcher 26.12.2010 um 19:11:53 Uhr
Goto Top
Hallo,

@rubberman: Du warst zu schnell mit deinem Test, Ihr habt alle einfach zu viel Zeit ... und das zu Weihnachten.

Ich hab es auf einem Vista System getestet und komme auch auf 1184 Verschachtelungen.
Die Länge des Strings beim Vergleich oder auch der Inhalt der in den Klammern steht scheint dabei keine Rolle zu spielen.

Allerdings würde ich nicht sagen, dass das wirklich problemlos klappt!
Danach geht bei mir nämlich nicht mal mehr der DIR Befehl!!! Andere Befehle klappen aber noch.
Da gehe ich mal von einem weiteren Buffer-Overrun in der cmd.exe aus.

Grüße
jeb
rubberman
rubberman 26.12.2010 um 21:14:17 Uhr
Goto Top
Zitat von @jeb-the-batcher:
@rubberman: Du warst zu schnell mit deinem Test, Ihr habt alle einfach zu viel Zeit ... und das zu Weihnachten.
Och, das hat mich von der Idee bis zum Ergebnis ~15 Minuten gekostet. BTW Da scheint es noch jemanden mit zu viel Zeit zu geben face-wink


Zitat von @jeb-the-batcher:
Die Länge des Strings beim Vergleich oder auch der Inhalt der in den Klammern steht scheint dabei keine Rolle zu spielen.
Kann ich bestätigen.

Zitat von @jeb-the-batcher:
Allerdings würde ich nicht sagen, dass das wirklich problemlos klappt!
Danach geht bei mir nämlich nicht mal mehr der DIR Befehl!!! Andere Befehle klappen aber noch.
Da gehe ich mal von einem weiteren Buffer-Overrun in der cmd.exe aus.
So weit habe ich dann doch nicht getestet. Interessant.

Zitat von @jeb-the-batcher:
Grüße
jeb
Ausklingende Weihnachtsgrüße zurück
rubberman
jeb-the-batcher
jeb-the-batcher 26.12.2010 um 22:05:08 Uhr
Goto Top
Hallo,

> Zitat von @jeb-the-batcher:
> ----
> Allerdings würde ich nicht sagen, dass das wirklich problemlos klappt!
> Danach geht bei mir nämlich nicht mal mehr der DIR Befehl!!! Andere Befehle klappen aber noch.
> Da gehe ich mal von einem weiteren Buffer-Overrun in der cmd.exe aus.
So weit habe ich dann doch nicht getestet. Interessant.

Es war auch bloß Zufall, ich wollte wissen wie groß test.bat ist, und cmd.exe sagt mir er kennt kein DIR mehr.

@blub-made
Und ich verwende massig Einsprungpunkte, die bei einer
so großen Datei warscheinlich nicht gefunden werden.

Ich glaube nicht das es daran liegen kann, denn ...
Bei einer Datei mit 4000 Sprungmarken, davon wird die Hälfte "Vorwärts" angesprungen, die andee Hälfte "Rückwärts" klappt es.
Selbst bei jeweils 10000 Labels klappt noch alles, dabei ist die Datei ca 1MB groß.

2000 Vorwärts in 1 Sek, Rückwärts 232 Sekunden
10000 Vorwärts in 7 Sek, Rückwärts 5784 Sekunden (ja über eine Stunde, 01:36:24)

@echo off
SETLOCAL EnableDelayedExpansion

set /a y=10000
set /a n=0

>"test.bat" type nul  
echo 1. %y% %time%
for /l %%i in (1,1,%y%) do (
  rem echo(schreibt 1. Haelfte %%i
  set /a back_n=%y%-%%i
  set /a back_nplus1=back_n+1
  (
	echo set /a n+=1
	echo goto :forward_%%i
	echo :backward_!back_n! label
	echo goto :backward_!back_nplus1! label

	echo :forward_%%i label
	echo(
	)   >>"test.bat"   
)
echo 2. %time%
(
	echo echo Forward %%n%% %%time%%
	echo goto :backward_0
	echo :backward_%y% label
	echo echo das Ende
) >>"test.bat"   

echo Aufruf "test.bat"  
call "test.bat"  
echo 3. Backward %time%
goto :eof

Gruß und immer noch wach
jeb
rubberman
rubberman 27.12.2010 um 00:55:28 Uhr
Goto Top
Zitat von @jeb-the-batcher:
2000 Vorwärts in 1 Sek, Rückwärts 232 Sekunden
10000 Vorwärts in 7 Sek, Rückwärts 5784 Sekunden (ja über eine Stunde, 01:36:24)
Dass es immer gleich so extreme Ausmaße annehmen muss... Mit der doppelten Zeit hätte ich ja gerechnet, da immer erst mal nach vorn gesucht wird.

kopfschüttelnd
rubberman
jeb-the-batcher
jeb-the-batcher 27.12.2010 um 01:05:07 Uhr
Goto Top
Eigentlich ist die Zeit gut nachvollziehbar.

Die Datei ist 5 mal so groß, also dauert das suchen eines Labels jedes mal 5 mal solange.
Es wird jedes mal die gesamte Datei dursucht, erst bis zum Ende der Datei und dann vom Anfang bis der Label endlich gefunden wird.

Da auch noch 5 mal mehr gesucht wird (10000 statt 2000) ergibt sich 5*5*232Sekunden=5800 Sekunden, was ja schon recht nah an der Messung dran ist.

Sprich je größer eine Batchdatei ist, desto langsamer wird sie.
Deutlich besser schneiden FOR-Loops und Blöcke ab, aber ich vermute, dass man die nicht überall einsetzen kann.

Da muss ich meine Batch-Library noch optimieren, denn sonst wird die immer langsamer je mehr Batch-Librarys included werden.

der Messende
jeb
rubberman
rubberman 27.12.2010 um 01:30:44 Uhr
Goto Top
Ich meinte in erster Linie den Unterschied zwischen vorwärts und rückwärts (der sich aber so auch erklären lässt).

Was FOR-Loops und Blöcke angeht, so ist mir das auch schon aufgefallen (ohne je Messungen durchgeführt zu haben) und Ja ich bin auch schon an Grenzen gestoßen. Zum Beispiel beim bedingten Verlassen einer Endlosschleife. Nicht funktionierendes Sinnlosbeispiel:
@echo off &setlocal
call :loop
pause
goto :eof

:loop
setlocal enabledelayedexpansion
set /a n=0
for /l %%i in (0) do (
  set /a n+=1
  echo !n!
  if !n!==20 (endlocal &goto :eof)
)
Jetzt wird's allerdings off topic.

Grüße
rubberman
90957
90957 27.12.2010 um 14:08:11 Uhr
Goto Top
Erstmal vielen Dank!
Ich habe jetzt einsehen müssen, dass die Fehler nicht
direkt mit einem Überlauf, einem Underrun oder einem anderen
Fehler seitens der cmd.exe zusammenhängen.

Mein Skript funktioniert trotz dem nicht und verursacht vollkommen
irrationale Fehler...
Hauptsächlich springt es einfach an anscheinden beliebigen
Stellen einen zufälligen Einsprungpunkt an...
Und manchmal funktioniert es plötzlich einwandfrei nur weil ich irgendwo
ein "echo %variable%" oder ein "pause" eingefügt habe...
Wenn ich diese aber wieder entferne spinnt das Programm wieder.

Jetzt bin ich eig auch schon ganz Offtopic (und verzweifelt)...

Soll ich n neues Thema aufmachen?

Ich möchte den gesammten Code hier nicht Posten...
Deshalb sende ich allen "Helfern" per pn einen Link zu meinem Skript incl.
der Spieldateien an denen das Skript pfuscht (sonst geht es net)...
(Das Spiel kennt ihr garantiert alle und ausser dem sind keine der Manipulationen Ilegal)
Wenn sich jemand die Zeit nehmen würde mir den/die Fehler den ich wohl gemacht habe aufzuzeigen oder mir sagen könnte dass der fehler nicht im Skript liegt,
würde ich mich sehr freuen.

Virenverdächtigungen sind bitte zu unterlassen, da laut VirusTotal.com keine infektion vorliegt!


Grüße
BluBb_mADe

*Edit:
Mir ist gerade aufgefallen, dass anscheinend alle hier das nur ab Vista getestet haben
Ich verwende aber zum Programmieren ein Netbook dem ich nicht mehr als XP zumuten will...
vllt sind die Einschränkungen da stärker...
yaDur1
yaDur1 28.12.2010 um 08:58:18 Uhr
Goto Top
Servus miteinander,

du schreibst: "in allen Variablen stecken ausschließlich strings aus zahlen und/oder kleinbuchstaben (oder sie sind leer)!!!".

Soweit mir bekannt, können leere Befehlsparameter die Syntax der IF-Abfrage durcheinander bringen. Näheres kannst du z.B. hier nachlesen: Batchkurs (Punkt 9).

Vielleicht liegts ja daran.. Weiterhin viel Spaß beim Fehlersuchen! ;)

Ciao
yaDur
JawCruncher
JawCruncher 28.12.2010 um 09:44:46 Uhr
Goto Top
Moin,

ein wirklich interessanter Thread. Und ich dachte schon, außer mir rogrammiert keiner mehr in Batch-Dateien und alle sind zu PowerShell & Co. gewechselt.

Eine Kleinigkeit ist mir noch eingefallen zu "irgendwo ein Echo oder Pause einfügen und schon geht es". Critical Races? Verwendest Du, evtl. unbewusst, mehr als nur einen Thread weil ein Ergebnis eines Wget etc. noch nicht vorliegt. Das passiert recht schnell wenn man Ergebnisse von extern (ohne /wait) gestarteten Programmen in Dateien schreiben lässt und diese dann schon in der Batch verwendet, bevor sie volständig geschrieben worden sind.

Jens
cobucom
cobucom 28.12.2010 um 12:53:24 Uhr
Goto Top
Nur mal ganz nebenbei: im ersten Programmschnipsel steckt ein Schreibfehler in der 9. Zeile! del f-l-ile.backup

Gruß cobucom
90957
90957 28.12.2010 um 13:40:47 Uhr
Goto Top
@yaDur1
Ja das ist mir bekannt, aus diesem Grund setzt man Variablen für gewöhnlich auch in Anführungszeichen ("%variable%")
Das verhindert Fehler bei leeren Variablen.

@JawCruncher
Ich glaube du bist zumindest ein halber Weinachtsegel xD
^^
Ich rufe die wget.exe ja ganz ohne Startbefehl (start /w) auf!!!
Das heißt auch kein "/w "!
Ich habe es zwar noch nicht getestet,
aber ich glaube das IST der Fehler!
So einfach und doch so versteckt...
Was für ein sch*** Fehler...

@cobucom
ja das ist richtig...
Dazu muss ich sagen, dass das sowieso kein Originalschnipsel ist.
Ich habe aus meinem Schnipsel alle Variablen- und Dateinamen geändert.
Daher vermutlich der schreibfehler...

Grüße
BluBb_mADe

PS:
Ich wünsche allen ein frohes Fest gehabt zu haben.
pieh-ejdsch
pieh-ejdsch 30.12.2010 um 04:23:10 Uhr
Goto Top
moin,
so hier ist schonmal ein Script fürs Script.

aufgrund der Länge Deines Scriptes hab ich das erstmal zusammengekloppt damit man den Überblick im Script behält.
Hilfe ist enthalten
getestet und bestanden
::---schnipp---SonderZeichenNachEcho.cmd---
@echo off&setlocal
:: Überprüfen von Batchdateien
:: Findet nicht Escapte Sonderzeichen nach dem echo Befehlen als 1. Befehl der Zeile
set "AOK="  
set "del="  
set "Ausgabe="  
set "Eingabe="  
set "Tempfile="  
set "Um="  
:Parameter
set "Opt="%1""  
setlocal enabledelayedexpansion
if "!Opt!" == """" (endlocal&goto :Paraend) else set "Opt=!Opt:"=!"  
if "!Opt!" == "/?" goto :help  
(for /f "delims=" %%i in ("!Opt!") do endlocal&set "Opt=%%i")||(endlocal&shift /1 &goto :Parameter)  
echo "%Opt%"|findstr "* ? < > |"&&(echo Zeichen im Dateinamen nicht erlaubt!&exit /b2)  
if "%Opt:~0,1%" == "/" (  
	if /i "%Opt:~0,2%" == "/a" if not defined del (set "AOK=1"  
		set "Ausgabe=%Opt:~2%"  
	)
	if /i "%Opt:~0,2%" == "/-" if not defined AOK (set "del=1"  
		set "Ausgabe=%Opt:~2%"  
	)
) else (if exist "%Opt%" (set "Eingabe=%Opt%") else (echo QuellDatei "%Opt%" nicht gefunden!&exit /b1 ) )  
shift /1 &goto :Parameter
:Paraend
if not defined Eingabe (echo Syntaxfehler. Quelldatei eingeben!&exit /b2 )
if defined Ausgabe if /i not "%Eingabe%" == "%Ausgabe%" (type nul>"%Ausgabe%" ||(echo Fehler im Zielpfad!&exit /b3 ) )   
if defined Ausgabe set "TempFile=%temp%\scripttmp"&set "Um= >"  
goto :nohelp
:help
(
echo Findet Befehlszeichen nach ECHO in Dateien oder schreibt zus„tzliche
echo Kommentarzeilen ins neue Script oder entfernt diese.
echo Umlaute werden in den Echo Zeilen CMD-Kompatibel umgeschrieben.
echo.& echo Syntax:
echo %~n0 [Laufwerk:][Pfad]ScriptName [/- ^| /a[Laufwerk:][Pfad][Ziel]]
echo.   
echo.  ScriptName  Zu šberprfendes Script
echo.  /-         KommentarZeilen beginnend mit ::-- werden gel”scht 
echo   /a          Alle ScriptZeilen werden mit extra KommentarZeilen ausgegeben.
echo                OHNE /a nur die KommentarZeilen und gefundenen Zeilen.
echo   Ziel       Neuzuschreibendes Script
)
:nohelp
set "Line="  
(
echo @echo off^&setlocal enabledelayedexpansion
echo.echo.!Line%%~1!
)>"%~dp0Linetest000.cmd"  
::grobes Muster
::type "%Eingabe%"|findstr /n "^"|findstr "echo[^(]"|findstr "[^\^][()|&<>]"  
(
for /f "delims=" %%i in ('findstr /n "^" "%Eingabe%"') do (  
	for /f "delims=:" %%A in ("%%i") do (  
		set "line=%%i"  
		set "OK=%AOK%"  
		setlocal enabledelayedexpansion
		set "line=!line:*:=!"  
		if defined del (
			for /f %%j in ("!Line!") do if "%%j" == "::--" set "OK=1"  
			if not defined OK echo.!Line!
		)
		if not defined del (
			for /f %%j in ("!Line!") do (  
				set "echo=%%j"  
				set "echo=!echo:@=!"  
				set "echo=!echo:~0,4!"  
				for /f %%k in ("!echo!") do set "Line1=!Line:*%%k=!"  
				set "Line1= !Line1:~1!"  
				if /i "!echo!" == "echo" (  
					set "line=!line:ß=á!"  
					set "line=!line:Ä=Ž!"  
					set "line=!line:Ö=™!"  
					set "line=!line:Ü=š!"  
					set "line=!line:ä=„!"  
					set "line=!line:ö=”!"  
					set "line=!line:ü=!"  
					"%~dp0Linetest000" 1|findstr "[^\^][()|&<>]">nul && (  
						set "OK="  
						echo.::--
						echo.::-- -- Zeile  %%A Keine Escapten SonderZeichen gefunden -- --::
						echo.!Line!
			)	)	)
			if defined OK echo.!Line!
		)
		endlocal		
)	)
)%Um%%TempFile%
if defined TempFile move /y "%TempFile%" "%Ausgabe%"  
del "%~dp0Linetest000.cmd"  
::---schnapp---SonderZeichenNachEcho.cmd---

Gruß Phil
90957
90957 20.02.2011 um 12:34:36 Uhr
Goto Top
Wow...
Vielen Dank, das ist echt praktisch!
Mit deiner Erlaubnis Speichere ich mir das gleich für spätere Skripte.

Ich habe den Fehler jetzt endlich gefunden!
Er ist so simpel und gleichzeitig so verzwickt gewesen...

Anscheinend hat mein Editor (vermutich auf irgendeinen unwissendlichen Klick meinerseits)
die Zeilenumbrüche auf LF umgestellt.

Den unterschied sieht man nicht da man die Zeilenumbrüche normalerweise
ausgeblendet hat und alle erweiterten Editoren auch diesen Zeilenumbruch anerkennen...

Erst als ich die Datei im Windows Editor geöffnet habe ist es mir aufgefallen...
Kein einziger Zeilenumbruch in der Datei!

Anscheinend kommt Batch nur teilweise mit diesem LF Zeilenumbruch klar.

Wenn es um Einsprungpunkte geht brauch Batch leider eben doch die Windowsstandatisierten CRLF Zeilenumbrüche.

Noch mal danke an alle für die tatkräftige Unterstützung!

Gruß
BluBb_mADe
jeb-the-batcher
jeb-the-batcher 20.02.2011 um 22:45:32 Uhr
Goto Top
Hallo BluBb-mADe,

schön, dass dein Problem gelöst ist.

Aber ich verstehe nicht ganz wieso es durch die Umstellung von LF auf CR/LF gelöst wurde.

Weil bei mir hat ein Schnelltest keinen Unterschied gezeigt.
Kannst du ein Beispiel zeigen, bei dem das Zeilenende einen Unterschied bei der Ausführung auslöst?

Gruß
jeb
90957
90957 21.02.2011 um 10:34:27 Uhr
Goto Top
Das Problem tritt warscheinlich bei viel Code und vielen Einsprungpunkten auf...
Ich hatte immer das Problem, dass das Programm einfach an beliebige, total verrückte Einsprungpunkte
gehupft ist.
Sonst ging ja auch alles.
Ich weiß nicht genau, ob das jetzt an call mit parameter oder am goto gescheitert ist.
(Une es ist mir auch egal xD da Windows selbst den Zeilenumbruch mit LF normalerweise überhaupt nicht akzeptiert.)
Ich vermute das Windows bei so großen Batch-Dateien einfach irgendeine art Problem mit dem Zeilenfinden hat...

Seid ich das geändert habe geht es wieder Fehlerfrei (abgesehen von meinen eigenen Fehlern)...

Gruß
BluBb_mADe
Heiß diskutiert
superfun2k24Sophos SFOS 20 DNAT funktioniert nichtsuperfun2k24 - 26 Kommentareuser217Kaufberatung Hardware - Hyper-V Cluster 3 Nodesuser217 - 25 KommentarePharaunIntel-E810 QSFP28 to Mikrotik QSPF+ mit 40Gbit VerbindungPharaun - 23 KommentarecseLaufwege erfassen in großer Hallecse - 20 Kommentareprplemk2Testumgebung bauen (Grundlegend)prplemk2 - 19 KommentareaufdemmarsHP Z620 USB hat kein Strom beim Startenaufdemmars - 17 KommentareYan2021Nachricht an mehrere PCs im Netzwerk sendenYan2021 - 17 KommentareTJ.Hooker74Dom.Admin-Passwort ändern - Auswirkungen auf EX, HCW, AADCTJ.Hooker74 - 14 KommentareJudgelgZertifikate in die Exchange Online GAL hochladenJudgelg - 13 KommentareadmtechEntwicklertagebuch: Release 6.4 - Filteradmtech - 13 KommentaremaisenkaiserSwitch ohne STP ins Netzwerkmaisenkaiser - 13 KommentareleberkaeseFB7590 ISDN Fax-Funktionleberkaese - 12 Kommentare