ERRORLEVEL ändert sich erst bei zweitem Durchlauf
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.
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.
REM erstes Script
for /l %%i in (1,1,1) do (
echo a|find /i "a">nul
if %errorlevel% EQU 0 ( echo Test:Geht! Errorlevel:%errorlevel%) else (echo Test:Geht nicht! Errorlevel:%errorlevel%)
)
REM zweites Script
for /l %%i in (1,1,1) do (
echo a|find /i "ab">nul
if %errorlevel% EQU 0 ( echo Test:Geht! Errorlevel:%errorlevel%) else (echo Test:Geht nicht! Errorlevel:%errorlevel%)
)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665551
Url: https://administrator.de/contentid/665551
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
14 Kommentare
Neuester Kommentar
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!
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.
If("dbfhaa".Contains("a")) {...}
If("dbfhaa" -match "a") {...}
If([regex]::Match("dbfhaa", "a").Success) {...}
Grüße!
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
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.
@echo off
SetLocal EnableDelayedExpansion
for /l %%i in (1,1,1) do (
echo a|find /i "ab">nul
if !errorlevel! EQU 0 ( echo Test:Geht^^! Errorlevel:!errorlevel!) else (echo Test:Geht nicht^^! Errorlevel:!errorlevel!)
)
Gruß Thomas
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:
@echo off
set x=0
(
set /a x+=1
echo x=%x%
set /a x+=1
echo x=%x%
set /a x+=1
echo x=%x%
)
echo x=%x%
pause
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:
x=1
x=2
x=3
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.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:
for /f "usebackq" %%A in ("C:\Test\Quelle.TXT") do (
echo Mach was mit "%%A"
)
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:
Zitat von @colinardo:
Powershell Leitfaden für Anfänger
Pflichtlektüre
- Kapitel 1: Erste Schritte mit PowerShell
- Kapitel 2: Das Hilfesystem
- Kapitel 3: Entdecken von Objekten, Eigenschaften und Methoden
- Kapitel 4: Einzeiler und die Pipeline
- Kapitel 5: Formatierung, Aliase, Anbieter, Vergleich
- Kapitel 6: Flusssteuerung
- Kapitel 7: Arbeiten mit WMI
- Kapitel 8: PowerShell-Remoting
- Kapitel 9: Funktionen
- Kapitel 10: Skriptmodule
- Anhang A: Hilfesyntax
Erweiterte Grundlagen
- Alles, was Sie schon immer über Arrays wissen wollten
- Alles, was Sie schon immer über Hashtabellen wissen wollten
- Was Sie schon immer über PSCustomObject wissen wollten
- Alles, was Sie schon immer über die Variablenersetzung in Zeichenfolgen wissen wollten
- Alles, was Sie schon immer über die IF-Anweisung wissen wollten
- Alles, was Sie schon immer über die switch-Anweisung wissen wollten
- Alles, was Sie schon immer über Ausnahmen wissen wollten
- Alles, was Sie schon immer über $null wissen wollten
- Alles, was Sie schon immer über ShouldProcess wissen wollten
- Verwenden von Erweiterung mit der TAB-TASTE
Zusätzliche Ressourcen
">" 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.
Dein Beispiel funktioniert also nur, wenn in deiner Wunschvariable eine Pfadangabe steht, z.B.
set WUNSCHVARIABLE=C:\Test\Ausgabe.txt
...
echo %%~ni|find /i "abc">%WUNSCHVARIABLE%
Hallo,
eine gute Quelle wenn es um Batch und Powershell geht ist ss64.com.
Schau dich da mal um.
Gruß
Klaus
eine gute Quelle wenn es um Batch und Powershell geht ist ss64.com.
Schau dich da mal um.
Gruß
Klaus