
90957
24.12.2010
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 157539
Url: https://administrator.de/forum/if-verschachtelung-wie-weit-kann-mans-treiben-157539.html
Ausgedruckt am: 05.07.2025 um 04:07 Uhr
29 Kommentare
Neuester Kommentar
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
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
versuch doch mal
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
if "%x%" == "%y%" (....
sonst - falls eine dieser Variablen im Vergleich nicht gesetzt ist (oder Leerzeichen; einige Sonderzeichen enthält) fasst IF in die Grütze.
Gruß Phil
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
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
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
einzufügen?
[Edit] etwas zu spät [/Edit]
Gruß Phil
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)
[Edit] etwas zu spät [/Edit]
Gruß Phil
in allen Variablen stecken ausschließlich strings aus zahlen und/oder kleinbuchstaben
(oder sie sind leer)!!!
(oder sie sind leer)!!!
dazu
If "%var1%"=="%var2%" (
echo aktuell
) else (....
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 werdenwget ... war ich mir nicht sicher ...
Gruß Phil
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?
@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
Hallo BluBb_mADe.
Wie tief man IFs verschachteln kann, habe ich eben mal kurz getestet.
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
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
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
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:
Wird zu...
und...
Mathe172
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
REM Sub.bat:
set /a a=%~1*%~2
set /a b=%~1/%~2
echo(%a% %b%
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
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: 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
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 @rubberman: Du warst zu schnell mit deinem Test, Ihr habt alle einfach zu viel Zeit ... und das zu Weihnachten.
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.Die Länge des Strings beim Vergleich oder auch der Inhalt der in den Klammern steht scheint dabei keine Rolle zu spielen.
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.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.
Ausklingende Weihnachtsgrüße zurück
rubberman
Hallo,
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
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)
Gruß und immer noch wach
jeb
> 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.
> ----
> 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.
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
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.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)
kopfschüttelnd
rubberman
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
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
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:
Jetzt wird's allerdings off topic.
Grüße
rubberman
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)
)
Grüße
rubberman
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
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
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
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
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
Gruß Phil
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 šberprfendes 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
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
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