ERRORLEVEL ändert sich erst bei zweitem Durchlauf

Mitglied: bluemen

bluemen (Level 1) - Jetzt verbinden

08.04.2021, aktualisiert 19:38 Uhr, 494 Aufrufe, 14 Kommentare, 1 Danke

Hallo Leute,

wenn ich folgenden Code in einer Batch-Datei speichere, und diese dann ausführe, kommt es zu einem seltsamen Verhalten.

Zur "Sicherheit" zuerst den ersten Code, als Script 2x aufgerufen. Jeweils ERRORLEVEL 0.
Danach den zweiten Code, ebenfalls zweimal.

Nun das Unklare:
Beim zweiten Code bekomme ich beim ersten "Durchlauf", ebenfalls den ERRORLEVEL 0 (obwohl find nicht 0 zurückliefern sollte), beim zweiten Mal dann ERRORLEVEL 1.
Woran liegt das und wie kann ich das verhindern?
Wenn nun wieder der erste Code aufgerufen wird, erzeugt der erste Durchlauf wiederrum ERRORLEVEL 1, beim zweiten Mal dann 0.

Ich verstehe es nicht und hoffe, jemand hat einen Tipp für mich.


Mitglied: mayho33
08.04.2021, aktualisiert um 21:45 Uhr
Hi!

Ich bin kein Batch-Guru, aber wenn mich nicht alles täuscht, dann durchläuft deine For den String zeichenweise.

Da das erste Zeichen String ein A ist und du nach einem A suchst, das zweite Zeichen aber ein B, bekommst du beim 2. Durchlauf einen Error.


Wenn es nicht Batch sein muss, dann empfehle ich auf Powershell umzusteigen. Mit Regex oder auch der Contains-Methode oder -match läuft das wesentlich komfortabler.


Grüße!
Bitte warten ..
Mitglied: TK1987
LÖSUNG 08.04.2021, aktualisiert um 22:11 Uhr
Moin,

Variablen, die sich innerhalb einer Befehlsgruppierung (in deinem Fall die For-Schleife) ändern; und innerhalb der selben Gruppierung wieder aufgerufen werden, müssen verzögert werden. Andernfalls wird der Wert ausgegeben, den die Variable vor der Gruppierung hatte.

Gruß Thomas
Bitte warten ..
Mitglied: bluemen
09.04.2021, aktualisiert um 08:50 Uhr
Guten Morgen und

vielen Dank Thomas, das war die Lösung!

Ich habe noch eine Frage zu den Ausrufezeichen. Wann müssen die gesetzt werden? Wenn ich es richtig verstehe, wird der Interpreter dadurch veranlasst, die Variable erst "bei Bedarf" auszulesen. Bedeutet das, ich ersetze % durch !, wenn die Variable verzögert ausgelesen werden soll und bei allen anderen (nicht verzögert auszulesenden) bleibt es bei % (wie z.B. in der Schleife (%%i)?
Und was machen die ^^? Wofür sie sorgen habe ich herausgefunden, nur bislang keine Erklärung im Netz gefunden, um die generelle Verwendung zu verstehen. Magst du das eventuell noch etwas kommentieren bzw. gibt es eine Quelle, wo man die Infos gebündelt findet?

Danke
Bodo

PS: Noch eine Frage ohne direkten Zusammenhang. Wie bekomme ich das Ergebnis in die "Wunsch"Variable --> echo %%~ni|find /i "a">%wunschvariable% hat bislang nicht funktioniert.
Bitte warten ..
Mitglied: TK1987
LÖSUNG 09.04.2021, aktualisiert um 08:50 Uhr
Ich habe noch eine Frage zu den Ausrufezeichen. Wann müssen die gesetzt werden?
sobald die Variablenverzögerung mit Setlocal EnableDelayedExpansion aktiviert wurde, kann man theoretisch jede Variable sowohl mit %, als auch mit ! aufrufen.

Dies wird z.B. dann erforderlich, wenn Befehle entweder in Klammern oder mit einem "&" Gruppiert wurden. Führe zum Beispiel mal folgendes Skript aus:

Was macht das Skript? Erst setzen wir die Variable x auf 0. Dann in den Klammern erhöhen 3 mal um 1 und geben es aus. Anschließend hinter den Klammern geben wir x erneut aus.

Erwarten würde man hier nun:
Dieses Ergebnis würden wir ohne Klammern auch erhalten - hier erhalten wir jedoch 3x "x=0". Man könnte meinen es wurde nicht gezählt - am Ende erhalten wir hinter der Klammer jedoch vollkommen korrekt "x=3".
Die Variable x haben wir innerhalb der Gruppierung geändert. Um dort das aktuelle Ergebnis zu erhalten, muss die Variable mit ! Verzögert werden.

Und was machen die ^^?
Das sind Escapezeichen. Sobald die Variablenverzögerung aktiviert wurde, werden Ausrufezeichen als Variablen interpretiert. Um einen Text mit einem Ausrufezeichen ausgeben zu können, musst du in dem Fall die Ausrufezeichen so darstellen.
Bitte warten ..
Mitglied: bluemen
09.04.2021, aktualisiert um 09:10 Uhr
Super Erklärung!

Hab gerade viel gelernt ... und mir erlaubt, noch eine Frage "nachzuschieben". Wenn ich dazu noch einen Tipp bekomme, ist der Tag perfekt! :-) face-smile

... PS: Noch eine Frage ohne direkten Zusammenhang. Wie bekomme ich das Ergebnis in die "Wunsch"Variable --> echo %%~ni|find /i "a">%wunschvariable% hat bislang nicht funktioniert.
Bitte warten ..
Mitglied: TK1987
09.04.2021, aktualisiert um 09:37 Uhr
Wie bekomme ich das Ergebnis in die "Wunsch"Variable --> echo %%~ni|find /i "a">%wunschvariable% hat bislang nicht funktioniert.
Deine Variable %%i ist bislang ja auch nur eine Zählervariable.
Woher soll der Wert für deine "Wunschvariable" den kommen? TXT, CSV oder woraus soll die ausgelesen werden?
Folgendes gibt dir eine Text-Datei zeilenweise aus:

gibt es eine Quelle, wo man die Infos gebündelt findet?
Glaube nicht, es gibt m.W.n. nur Befehlserläuterungen, die aber im Prinzip auch nur die Hilfedateien wiedergeben, oder Erläuterungen zu bestimmten Problemen.
CMD zu erlernen ist in der heutigen Zeit aber ohnehin auch ziemlich Sinnfrei, da die Sprache längst tot ist, nur sehr eingeschränkte Möglichkeiten bietet und zudem ziemlich buggy ist.

Heute nimmt man für sowas Powershell, ist sowieso viel leichter zu lernen und dafür gibt es auch gebündelte Infos:

Bitte warten ..
Mitglied: bluemen
09.04.2021, aktualisiert um 09:52 Uhr
Sorry, der notwendige "Rest" hat gefehlt.


Das Ergebnis von find hätte ich gern an die wunschvariable übergeben.

Powershell schaue ich mir an. :-) face-smile
Bitte warten ..
Mitglied: TK1987
09.04.2021 um 11:08 Uhr
Dafür nimmt man besser findstr.
So erhälst du in der Schleifenvariable %%A jeweils die Zeilen, die die Zeichenfolge "abc" enthalten. Mit dieser kannst du dann weiterarbeiten.
Bitte warten ..
Mitglied: bluemen
09.04.2021 um 11:37 Uhr
Ok, dann nutze ich diesen Weg.

Würdest du mir bitte (trotzdem) verraten, wie ich in dem Beispiel:
das Ergebnis in %WUNSCHVARIABLE% bekomme?
Bitte warten ..
Mitglied: TK1987
09.04.2021, aktualisiert um 11:46 Uhr

Bitte warten ..
Mitglied: bluemen
09.04.2021, aktualisiert um 12:06 Uhr
Sorry, dass ich noch einmal frage aber mir ging es genau um dieses Beispiel, da ich verstehen möchte, warum > nicht funktioniert bzw. wie der korrekte Syntax lautet.

Danke für deine Geduld und ein schönes Wochenende
Noch eine Frage kommt (heute) nicht! :-) face-smile
Bitte warten ..
Mitglied: TK1987
09.04.2021, aktualisiert um 12:49 Uhr
">" leitet die Ausgabe eines Befehls in eine Datei um - nicht in Variablen.
Dein Beispiel funktioniert also nur, wenn in deiner Wunschvariable eine Pfadangabe steht, z.B.
würde dazu führen, das die Zeile(n), die du mit find gefunden hast, in die Datei "C:\Test\Ausgabe.txt" geschrieben wird.
Bitte warten ..
Mitglied: NikosLykos
09.04.2021 um 13:58 Uhr
Hallo,

eine gute Quelle wenn es um Batch und Powershell geht ist ss64.com.

Schau dich da mal um.

Gruß
Klaus
Bitte warten ..
Mitglied: bluemen
13.04.2021, aktualisiert 14.04.2021
Ich habe noch eine Frage hierzu:

Wie müsste der Code aussehen, wenn die Schleife nicht rekursiv arbeiten sollte (/R), bzw. ein bestimmtes Unterverzeichnis von der Bearbeitung ausgenommen werden soll?
Bitte warten ..
Heiß diskutierte Inhalte
Off Topic
Realistische Gehaltsvorstellung für eine "IT-Allroundkraft"
gelöst JiggyLeeVor 1 TagFrageOff Topic22 Kommentare

Hallo an alle, ich hege momentan den Wunsch mich von der alten verstaubten Behörden Bürokratie und langweiliger Aufgaben los zu lösen und in einem ...

Humor (lol)
Tipp: Dinge, die man besser nicht klaut
altmetallerVor 1 TagTippHumor (lol)17 Kommentare

Hallo, so wurde meiner Hündin z.B. heute der (eingeschaltete) GPS-Tracker mit Mobilfunkanbindung quasi "direkt vom Halsband weggefunden". Akku hatte noch 60% :-P Und ich ...

LAN, WAN, Wireless
Starlink im Unternehmen?
0xFFFFVor 6 StundenFrageLAN, WAN, Wireless20 Kommentare

Guten Morgen Admins, leider leiden wir darunter, dass wir uns hier in DE noch in einem Entwicklungsland was die Internetanbindung angeht, sehr. Nun kam ...

Microsoft
Datenkrake - Browser
DennisWeberVor 21 StundenErfahrungsberichtMicrosoft8 Kommentare

Hallo zusammen, ich empfehle euch mal definitiv in "Temp" Verzeichnis eures Browsers zu schauen. Es war für mich erschreckend, wie viele wichtige Dokumente und ...

Netzwerkmanagement
Sicherheitsrisiken Synology DS Admin Konto
RitchtoolsVor 1 TagFrageNetzwerkmanagement6 Kommentare

Hallo Zusammen, ich habe die Pflege von einem Firmen NAS übernommen (Synology) es sind mehrere Rechner im Netzwerk die auf Daten zugreifen. Leider hat ...

Grafikkarten & Monitore
Monitorhalterung mit 80cm Armlänge
ben1300Vor 1 TagFrageGrafikkarten & Monitore7 Kommentare

Guten Abend ! ich bin auf der Suche nach einer Monitorhalterung, im besten Fall ohne Bohrung für einen 28" Monitor (Vesa Halterung). Nun kommt ...

Cloud-Dienste
Cloud PBX bzw. IP Telefon für Ausland
decehakanVor 1 TagFrageCloud-Dienste3 Kommentare

Hallo Zusammen, Ich suche Cloud Telefon ( Cloud PBX, IP-Telefon), sodass ich von Ausland aus über eine deutsche Rufnummer auf mein Handy erreichbar bin. ...

E-Mail
Office 365 mit Wordpress nutzen
gelöst tobitobsnVor 1 TagFrageE-Mail6 Kommentare

Wir nutzen einen Webhoster, wo wir eine Wordpress Webseite betreiben und haben vor einiger Zeit zu Office 365 gewechselt. Unser Webhoster erlaubt innerhalb von ...