Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

If Verschachtelung - Wie weit kann mans treiben?

Frage Entwicklung Batch & Shell

Mitglied: BluBb-mADe

BluBb-mADe (Level 1) - Jetzt verbinden

24.12.2010 um 15:35 Uhr, 16088 Aufrufe, 29 Kommentare, 1 Danke

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
29 Antworten
Mitglied: pieh-ejdsch
24.12.2010 um 16:59 Uhr
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
Bitte warten ..
Mitglied: BluBb-mADe
24.12.2010 um 17:37 Uhr
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:

01.
set a=5 
02.
set x=5 
03.
set y=5 
04.
set z=5 
05.
IF %x%==%y% ( 
06.
   IF %y%==%z% ( 
07.
      IF %a%==%x% ( 
08.
         echo blablablablablablalangertext 
09.
         echo über mehrere zeilen 
10.
         echo als zeichen dass es nicht geht..... 
11.
         echo fragt nicht, das macht keinen sinn... 
12.
13.
14.
)
funktioniert bei mir manchmal schon nicht mehr.
(Das ist nur ein Beispiel, so verwende ich das natürlich nicht!!!)

Gruß
BluBb_mADe
Bitte warten ..
Mitglied: pieh-ejdsch
24.12.2010 um 21:09 Uhr
versuch doch mal
01.
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
Bitte warten ..
Mitglied: BluBb-mADe
24.12.2010 um 22:27 Uhr
Also ich poste jetzt erstmal ein Beispiel Programmschnipsel der net funktioniert:

01.
If "%var1%"=="%var2%" ( 
02.
	echo aktuell 
03.
) else ( 
04.
	if exist "file" ( 
05.
		ren file file.backup 
06.
07.
	wget -q -t 10 -N http://xxxxxxxxxxxx.xx/file 
08.
	if exist file ( 
09.
		del flile.backup 
10.
		for /L %%i in (1,1,5) do ( 
11.
			echo !var1!+%%i 
12.
			if "!var3!" == "!var1!+%%i" ( 
13.
				echo stimmt 
14.
15.
16.
		echo Erfolgreich auf  "!var2!" aktualisiert. 
17.
	) else ( 
18.
		ren file.backup file 
19.
		echo Fehler bei der Aktualisierung. 
20.
21.
)
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:
01.
if not "%vara%" == "" ( 
02.
	echo alt: "%vara%" 
03.
	echo neu: "%varb%" 
04.
) else ( 
05.
	echo alt: ist Defekt oder fehlt. 
06.
	echo neu: "%varb%" wird jetzt Installiert... 
07.
	echo. 
08.
09.
pause
..warum stürzt mein Skript dabei ab???
Bitte warten ..
Mitglied: jeb-the-batcher
25.12.2010 um 19:37 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
25.12.2010 um 19:41 Uhr
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
Bitte warten ..
Mitglied: BluBb-mADe
25.12.2010 um 21:15 Uhr
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:
>wget ... ein &&( mache das auch )||(mache das als ersatz)
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
Bitte warten ..
Mitglied: pieh-ejdsch
25.12.2010 um 21:41 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
25.12.2010 um 21:52 Uhr
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
Bitte warten ..
Mitglied: BluBb-mADe
25.12.2010 um 23:05 Uhr
@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
Bitte warten ..
Mitglied: jeb-the-batcher
26.12.2010 um 09:47 Uhr
Zitat von BluBb-mADe:
@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
Bitte warten ..
Mitglied: BluBb-mADe
26.12.2010 um 12:38 Uhr
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
Bitte warten ..
Mitglied: rubberman
26.12.2010 um 17:46 Uhr
Hallo BluBb_mADe.

Wie tief man IFs verschachteln kann, habe ich eben mal kurz getestet.
01.
@echo off &setlocal 
02.
 
03.
set /a x=1, y=1184 
04.
>"test.bat" type nul 
05.
 
06.
for /l %%i in (%x%,1,%y%) do ( 
07.
  echo(schreibt 1. Haelfte %%i 
08.
  >>"test.bat" echo(if %%x%%==%x% ( 
09.
10.
 
11.
>>"test.bat" echo(echo(FUNKTIONIERT 
12.
 
13.
for /l %%i in (%x%,1,%y%) do ( 
14.
  echo(schreibt 2. Haelfte %%i 
15.
  >>"test.bat" echo(^) 
16.
17.
 
18.
cls 
19.
echo(Aufruf "test.bat" 
20.
call "test.bat" 
21.
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
Bitte warten ..
Mitglied: mathe172
26.12.2010 um 17:53 Uhr
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:
01.
REM Das ist die Ausgangsdatei 
02.
set a=10 
03.
set b=5 
04.
call :Sub 
05.
echo %x% 
06.
echo %y% 
07.
pause 
08.
 
09.
:Sub 
10.
set /a x=a*b 
11.
set /a y=a/b 
12.
goto :eof
Wird zu...
01.
REM Sub.bat: 
02.
set /a a=%~1*%~2 
03.
set /a b=%~1/%~2 
04.
echo(%a% %b%
und...
01.
REM Kleinere batch: 
02.
set a=10 
03.
set b=5 
04.
for /F "tokens=1,2" %%A in ('Sub.bat %a% %b%') do set x=%%A & set y=%%B 
05.
echo %x% 
06.
echo %y%
Mathe172
Bitte warten ..
Mitglied: jeb-the-batcher
26.12.2010 um 19:11 Uhr
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
Bitte warten ..
Mitglied: rubberman
26.12.2010 um 21:14 Uhr
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


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
Bitte warten ..
Mitglied: jeb-the-batcher
26.12.2010 um 22:05 Uhr
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)

01.
@echo off 
02.
SETLOCAL EnableDelayedExpansion 
03.
 
04.
set /a y=10000 
05.
set /a n=0 
06.
 
07.
>"test.bat" type nul 
08.
echo 1. %y% %time% 
09.
for /l %%i in (1,1,%y%) do ( 
10.
  rem echo(schreibt 1. Haelfte %%i 
11.
  set /a back_n=%y%-%%i 
12.
  set /a back_nplus1=back_n+1 
13.
14.
	echo set /a n+=1 
15.
	echo goto :forward_%%i 
16.
	echo :backward_!back_n! label 
17.
	echo goto :backward_!back_nplus1! label 
18.
 
19.
	echo :forward_%%i label 
20.
	echo( 
21.
	)   >>"test.bat"  
22.
23.
echo 2. %time% 
24.
25.
	echo echo Forward %%n%% %%time%% 
26.
	echo goto :backward_0 
27.
	echo :backward_%y% label 
28.
	echo echo das Ende 
29.
) >>"test.bat"  
30.
 
31.
echo Aufruf "test.bat" 
32.
call "test.bat" 
33.
echo 3. Backward %time% 
34.
goto :eof
Gruß und immer noch wach
jeb
Bitte warten ..
Mitglied: rubberman
27.12.2010 um 00:55 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
27.12.2010 um 01:05 Uhr
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
Bitte warten ..
Mitglied: rubberman
27.12.2010 um 01:30 Uhr
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:
01.
@echo off &setlocal 
02.
call :loop 
03.
pause 
04.
goto :eof 
05.
 
06.
:loop 
07.
setlocal enabledelayedexpansion 
08.
set /a n=0 
09.
for /l %%i in (0) do ( 
10.
  set /a n+=1 
11.
  echo !n! 
12.
  if !n!==20 (endlocal &goto :eof) 
13.
)
Jetzt wird's allerdings off topic.

Grüße
rubberman
Bitte warten ..
Mitglied: BluBb-mADe
27.12.2010 um 14:08 Uhr
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...
Bitte warten ..
Mitglied: yaDur1
28.12.2010 um 08:58 Uhr
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
Bitte warten ..
Mitglied: JawCruncher
28.12.2010 um 09:44 Uhr
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
Bitte warten ..
Mitglied: cobucom
28.12.2010 um 12:53 Uhr
Nur mal ganz nebenbei: im ersten Programmschnipsel steckt ein Schreibfehler in der 9. Zeile! del f-l-ile.backup

Gruß cobucom
Bitte warten ..
Mitglied: BluBb-mADe
28.12.2010 um 13:40 Uhr
@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.
Bitte warten ..
Mitglied: pieh-ejdsch
30.12.2010 um 04:23 Uhr
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
01.
::---schnipp---SonderZeichenNachEcho.cmd--- 
02.
@echo off&setlocal 
03.
:: Überprüfen von Batchdateien 
04.
:: Findet nicht Escapte Sonderzeichen nach dem echo Befehlen als 1. Befehl der Zeile 
05.
set "AOK=" 
06.
set "del=" 
07.
set "Ausgabe=" 
08.
set "Eingabe=" 
09.
set "Tempfile=" 
10.
set "Um=" 
11.
:Parameter 
12.
set "Opt="%1"" 
13.
setlocal enabledelayedexpansion 
14.
if "!Opt!" == """" (endlocal&goto :Paraend) else set "Opt=!Opt:"=!" 
15.
if "!Opt!" == "/?" goto :help 
16.
(for /f "delims=" %%i in ("!Opt!") do endlocal&set "Opt=%%i")||(endlocal&shift /1 &goto :Parameter) 
17.
echo "%Opt%"|findstr "* ? < > |"&&(echo Zeichen im Dateinamen nicht erlaubt!&exit /b2) 
18.
if "%Opt:~0,1%" == "/" ( 
19.
	if /i "%Opt:~0,2%" == "/a" if not defined del (set "AOK=1" 
20.
		set "Ausgabe=%Opt:~2%" 
21.
22.
	if /i "%Opt:~0,2%" == "/-" if not defined AOK (set "del=1" 
23.
		set "Ausgabe=%Opt:~2%" 
24.
25.
) else (if exist "%Opt%" (set "Eingabe=%Opt%") else (echo QuellDatei "%Opt%" nicht gefunden!&exit /b1 ) ) 
26.
shift /1 &goto :Parameter 
27.
:Paraend 
28.
if not defined Eingabe (echo Syntaxfehler. Quelldatei eingeben!&exit /b2 ) 
29.
if defined Ausgabe if /i not "%Eingabe%" == "%Ausgabe%" (type nul>"%Ausgabe%" ||(echo Fehler im Zielpfad!&exit /b3 ) )  
30.
if defined Ausgabe set "TempFile=%temp%\scripttmp"&set "Um= >" 
31.
goto :nohelp 
32.
:help 
33.
34.
echo Findet Befehlszeichen nach ECHO in Dateien oder schreibt zus„tzliche 
35.
echo Kommentarzeilen ins neue Script oder entfernt diese. 
36.
echo Umlaute werden in den Echo Zeilen CMD-Kompatibel umgeschrieben. 
37.
echo.& echo Syntax: 
38.
echo %~n0 [Laufwerk:][Pfad]ScriptName [/- ^| /a[Laufwerk:][Pfad][Ziel]] 
39.
echo.    
40.
echo.  ScriptName  Zu šberprfendes Script 
41.
echo.  /-         KommentarZeilen beginnend mit ::-- werden gel”scht  
42.
echo   /a          Alle ScriptZeilen werden mit extra KommentarZeilen ausgegeben. 
43.
echo                OHNE /a nur die KommentarZeilen und gefundenen Zeilen. 
44.
echo   Ziel       Neuzuschreibendes Script 
45.
46.
:nohelp 
47.
set "Line=" 
48.
49.
echo @echo off^&setlocal enabledelayedexpansion 
50.
echo.echo.!Line%%~1! 
51.
)>"%~dp0Linetest000.cmd" 
52.
::grobes Muster 
53.
::type "%Eingabe%"|findstr /n "^"|findstr "echo[^(]"|findstr "[^\^][()|&<>]" 
54.
55.
for /f "delims=" %%i in ('findstr /n "^" "%Eingabe%"') do ( 
56.
	for /f "delims=:" %%A in ("%%i") do ( 
57.
		set "line=%%i" 
58.
		set "OK=%AOK%" 
59.
		setlocal enabledelayedexpansion 
60.
		set "line=!line:*:=!" 
61.
		if defined del ( 
62.
			for /f %%j in ("!Line!") do if "%%j" == "::--" set "OK=1" 
63.
			if not defined OK echo.!Line! 
64.
65.
		if not defined del ( 
66.
			for /f %%j in ("!Line!") do ( 
67.
				set "echo=%%j" 
68.
				set "echo=!echo:@=!" 
69.
				set "echo=!echo:~0,4!" 
70.
				for /f %%k in ("!echo!") do set "Line1=!Line:*%%k=!" 
71.
				set "Line1= !Line1:~1!" 
72.
				if /i "!echo!" == "echo" ( 
73.
					set "line=!line:ß=á!" 
74.
					set "line=!line:Ä=Ž!" 
75.
					set "line=!line:Ö=™!" 
76.
					set "line=!line:Ü=š!" 
77.
					set "line=!line:ä=„!" 
78.
					set "line=!line:ö=”!" 
79.
					set "line=!line:ü=!" 
80.
					"%~dp0Linetest000" 1|findstr "[^\^][()|&<>]">nul && ( 
81.
						set "OK=" 
82.
						echo.::-- 
83.
						echo.::-- -- Zeile  %%A Keine Escapten SonderZeichen gefunden -- --:: 
84.
						echo.!Line! 
85.
			)	)	) 
86.
			if defined OK echo.!Line! 
87.
88.
		endlocal		 
89.
)	) 
90.
)%Um%%TempFile% 
91.
if defined TempFile move /y "%TempFile%" "%Ausgabe%" 
92.
del "%~dp0Linetest000.cmd" 
93.
::---schnapp---SonderZeichenNachEcho.cmd---
Gruß Phil
Bitte warten ..
Mitglied: BluBb-mADe
20.02.2011 um 12:34 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
20.02.2011 um 22:45 Uhr
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
Bitte warten ..
Mitglied: BluBb-mADe
21.02.2011 um 10:34 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Router & Routing
gelöst Empfehlung günstiges ADSL2+ nur Modem (10)

Frage von TimMayer zum Thema Router & Routing ...

Server-Hardware
Lenovo Server System X 3650 M5 Festplatten (9)

Frage von Hendrik2586 zum Thema Server-Hardware ...