Operatoren

CED999

Lieutenant
Registriert
Juni 2011
Beiträge
980
Hallo,

also ich hätte eine weitere Frage zu der Eingabeaufforderung von Win7. Durch ausprobieren ist mir aufgefallen, dass folgendes aufgrund des Operators in Zeile 3 nicht funktioniert:

Code:
md "c:\test1"

if errorlevel [B]>=[/B] 0 goto allesok
echo Fehler das Verzeichnis konnte nicht erstellt werden
pause

:allesok
echo Das Verzeichnis konnte erstellt werden
pause


schreibe ich das selbe mit einem = in Zeile 3 funktioniert aber alles:

Code:
md "c:\test1"

if errorlevel = 0 goto allesok
echo Fehler das Verzeichnis konnte nicht erstellt werden
pause

:allesok
echo Das Verzeichnis konnte erstellt werden
pause

Das verstehe ich nicht ganz - und über if /? kommt auch nichts was das erklären würde...

Gruezi
 
Ist "if errorlevel = 0" nicht eine Zuweisung (also immer true)?
 
hm klingt interessant muss mal schauen - ist irgendwie schwierig was zu errorlevel zu finden
 
Das hat mit Errorlevel nichts zu tun.
Ich kenne die Batch nicht sonderlich gut, verglichen wird aber normalerweise mit einem doppelten Gleichheitszeichen.

Weiterhin weiß ich nicht, ob Vergleiche mit ">=" überhaupt möglich sind und wenn ja, wozu die CompareOps exisiteren.

Außerdem ist dein Beispiel oben vom Sinn her nicht so, wie man es erwarten würde, denn ein errorlevel größer Null, heißt, es gab einen Fehler.

*Edit: Und übrigens impliziert errorlevel bereits einen Vergleich, d.h. "if errorlevel 1".
 
Zuletzt bearbeitet:
Hi Powerfx,

Ja mit den von Dir verlinkten CompareOps hatte ich es schon ausprobiert, aber wenn ich schreibe

if errorlevel EQU 0

gibts eine Fehlermeldung, dass das syntaktisch nicht verarbeitet werden kann.

P.S. Ja das ist nur ein Beispiel - der Punkt kommt wohl rüber: es geht um die Operatoren...
 
CED999 schrieb:
if errorlevel EQU 0

gibts eine Fehlermeldung, dass das syntaktisch nicht verarbeitet werden kann.
Was auch nachvollziehbar ist.

Entweder "if errorlevel 0" oder "if %errorlevel% EQU 0".
 
Hi,

also ich verstehe den Sinn mit den zwei %-Zeichen nicht wirklich. In der Commandline Hilfe steht mit if/? auch nur total unverständliches Zeug mit "wenn die Befehlserweiterungen aktiviert sind".. Kannst Du mir das noch mal eingägig erklären? Merci.

Grüße
 
%errorlevel% ist eine Variable, errorlevel eine Variable inkl. Vergleich zum nächsten Wert.

Was du möchtest, ist vermutlich:
Code:
if %errorlevel% LEQ 1 goto allesok
 
Hai!

CED999 schrieb:
also ich verstehe den Sinn mit den zwei %-Zeichen nicht wirklich. In der Commandline Hilfe steht mit if/? auch nur total unverständliches Zeug mit "wenn die Befehlserweiterungen aktiviert sind".. Kannst Du mir das noch mal eingägig erklären?

Befehlserweiterungen sind Erweiterungen der Dir ansonsten nur recht simplen zur Verfügung stehenden Syntax. Diese kannst Du mit
Code:
SETLOCAL ENABLEEXTENSIONS
einschalten.

Meine Batchdateien (ich verwende diese recht häufig, weil man damit viel machen kann) starten grundsätzlich immer mit (ich habe das mal ein wenig kommentiert, damit Du weisst, warum ich da was mache):
Code:
:: Keine Ausgabe der Befehle
@ECHO OFF

:: Alle Änderungen an Umgebungsvariablen lokal halten.
SETLOCAL ENABLEEXTENSIONS

:: Parameter überprüfen. Wenn keine angegeben wurden, dann zum Ende gehen.
IF [%1]==[] GOTO Syntax

::
:: Benutzerdefinierte Anpassungen
::

:: z.B. Variablen vorbelegen
:: SET ...

::
:: Ende der benutzerdefinierten Anpassungen, d.h. hiernach müssen keine
:: Änderungen mehr vorgenommen werden.
::

:: ... Hier könnte beliebiger Code stehen

::
:: Hier folgen Fehlerfälle und ein Endelabel
::

::
:Syntax
ECHO Batchdatei
ECHO.
ECHO Diese Batchdatei macht irgendwas.
ECHO.
ECHO Aufruf:
ECHO   Batchdatei Parameter
GOTO Ende

:Ende
:: Evtl. erfolgte Änderungen an Umgebungsvariablen ungeschehen machen.
ENDLOCAL

Mit den Befehlserweiterungen (Hilfe dazu über
Code:
SETLOCAL /?
) kannst Du z.B. in Bedingungen auch arithmetische Operatoren verwenden (à la: if a+b GT d).

Du kannst übrigens generell kein >= oder <= (auch > und < gehen nicht) verwenden, weil diese Zeichen für die Ein-/Ausgabeumleitung verwendet werden.

Gruß,
Thorsten
 
Hallo ThorstenBehrens,

danke Dir für dein Beispiel - ich bin noch ein bisschen verwirrt. Wenn mir jemand folgendes sagen könnte, könnte ich mich langsam aus dem Tal des nix raffens rausarbeiten:

1.) Wenn ich (ohne Befehlserweiterungen) schreiben würde: "if errorlevel==0" dann würde das schon bedeuten, dass das Errorlevel genau = 0 sein MUSS. Ja/Nein?

2.) Könntet ihr mir jeweils einen kurzen Befehlt nennen, der immer untrue ist. Ich meine eine Aktion bei der Errolevel NICHT= 0 ist.

3.) Eine Aktion, die immer WAHR ist. Bis jetzt nutze ich md c:\test1 und es erstaunt mich, dass es auch true ist wenn der Ordner schon besteht. Eigentlich müsste das KREIEREN des ordners doch untrue sein, weil schon vorhanden...

Thx allen... Bin wie (fast immer) positiv überrascht von dem Forum
 
Siehe #6.
"if errorlevel == 0" ist offenbar falsche Syntax für das was du möchtest.
 
Hai!

CED999 schrieb:
1.) Wenn ich (ohne Befehlserweiterungen) schreiben würde: "if errorlevel==0" dann würde das schon bedeuten, dass das Errorlevel genau = 0 sein MUSS. Ja/Nein?

Du musst folgendes unterscheiden: Variablen, die Du in deinen Batches verwendest, sind immer in %-Zeichen (es gibt auch noch das !-Zeichen, aber das ist dann ein Spezialfall) einzuschließen. Die Abfrage "IF ERRORLEVEL 1" ist eine if-Anweisung, die eine spezielle Bedingung verwendet, nämlich das Schlüsselwort ERRORLEVEL (neben ERRORLEVEL gibt es z.B. noch EXIST zur Abfrage, ob eine Datei/Verzeichnis existiert) - das ist etwas anderes als die Variable ERRORLEVEL, die Du oben verwenden willst.

Antwort also: Nein, weil mit dem Schlüsselwort ERRORLEVEL automatisch eine Prüfung auf größer oder gleich mit dem folgenden numerischen Wert verbunden ist und deshalb das doppelte Gleichheitszeichen hier syntaktisch falsch ist. Wenn Du die Variable ERRORLEVEL abfragen willst, dann müsstest Du %ERRORLEVEL% schreiben und dann hättest Du recht, denn es würde genau auf 0 geprüft.

Kurzer Einschub: Es ist generell gar keine gute Idee, Variablen zu verwenden, die Schlüsselworten von DOS entsprechen. Das resultiert in Fehlern, die man nur sehr schwierig finden kann.

Soweit die Theorie: Kommen wir jetzt zur Praxis der DOS-Befehle, denn die ist manchmal sehr seltsam, um es mal vorsichtig auszudrücken ;)

Offenbar setzt die Command Shell (zumindestens unter Win7, das ich hier nur zur Verfügung habe - so ändern sich bei den DOS-Befehlen gerne einmal kleinere Details, was man nur durch Ausprobieren herausfindet) die Anweisung
Code:
IF ERRORLEVEL==0
als
Code:
IF ERRORLEVEL 0
um - das kannst Du leicht in einer eigenen Batchdatei testen, wenn Du einfach ECHO ON ganz zu Anfang dieser Batchdatei schreibst und dann z.B. beide Befehle mit einem ECHO irgendwas dahinter eingibst.

CED999 schrieb:
2.) Könntet ihr mir jeweils einen kurzen Befehlt nennen, der immer untrue ist. Ich meine eine Aktion bei der Errolevel NICHT= 0 ist.

Das ist nicht ganz so einfach. Die beste Lösung, die mir einfällt (und die ab ... hmmm ... Windows NT? ... funktionieren sollte) ist eine, für die man eine zweite Batchdatei (z.B. mit dem Namen setel.bat) benötigt:
Code:
:: Batchdatei zum Setzen des ERRORLEVELS auf den Wert 1
EXIT /B 1

Diese Datei ruft man dann aus der Batchdatei auf, in der man den Errorlevel test will:
Code:
CALL setel.bat
IF ERRORLEVEL 1 ECHO Hat geklappt

CED999 schrieb:
3.) Eine Aktion, die immer WAHR ist. Bis jetzt nutze ich md c:\test1 und es erstaunt mich, dass es auch true ist wenn der Ordner schon besteht. Eigentlich müsste das KREIEREN des ordners doch untrue sein, weil schon vorhanden...

Wenn Du ein bereits existierendes Verzeichnis mit MD nochmals kreieren willst, dann wird der Errorlevel auf 1 gesetzt, wie man leicht mit
Code:
ECHO ON
MD test
ECHO %ERRORLEVEL%
MD test
ECHO %ERRORLEVEL%
testen kann.

Folgender Befehl sollte (im Normalfall) immer den Errorlevel 0 liefern:
Code:
DIR C:
(Ausnahme: Du hast keine Zugriffsberechtigung auf C: oder ein Laufwerk mit dem Buchstaben existiert nicht - beides ist im Normalfall nicht so).

Gruß,
Thorsten
 
Danke Thorsten Die Antwort war GENIAL :daumen: und hat mich weitergebracht... Habe zwar noch viele Fragen aber ist schon wirklich besser.

Eine Frage an Dich und die anderen (falls das sonst noch einer liest ;) ) wäre ob jobs von Programmen auch einen Einfluss auf die Variable Errorlevel haben.

Ich könnte ja in Batch reinschreiben starte eine Systemscan mit Norton gestartet wird (das geht über Commandline) und ist mir nicht ganz klar ob wenn der scan einen Fehler erbringt (Virus gefunden) das dann die Variable Errorlevel auch beeinflusst, oder für welche Programme das dann nur gilt. Bei Chkdsk gilt es ja auch.. Oder man könnte einen Backupjob mit Acronis starten und wenn das einen Fehler bringt würde sich der Errorlevel auch erhöhen.

Leider habe ich dazu bei Norton nichts gefunden und meine Anfrage hat auch nichts gebracht (bis jetzt). Meine Frage hier wäre eher ob da jemand Erfahrung hat ob das generell geht oder nicht...

Grüße!
 
Hai!

CED999 schrieb:
Danke Thorsten Die Antwort war GENIAL :daumen: und hat mich weitergebracht... Habe zwar noch viele Fragen aber ist schon wirklich besser.

Fein.

CED999 schrieb:
Eine Frage an Dich und die anderen (falls das sonst noch einer liest ;) ) wäre ob jobs von Programmen auch einen Einfluss auf die Variable Errorlevel haben.

Nur dann, wenn die Programmierer dies vorgesehen haben. Es setzen ja auch nicht alle DOS-Befehle den Errorlevel und früher (also definitiv vor NT) war es teilweise auch ein Sammelsurium, was da zurückgegeben worden ist (mal positive Werte, mal negative Werte im Fehlerfall).

Bei (eigenen; fremde kann man, da bei Batches ja der Code vorliegt, entsprechend bearbeiten) Batchfiles kann man mit einem "EXIT /b <wert>" den Errorlevel ja selbst setzen. Das dürfte (das ist aber eine Annahme und ich habe jetzt keine Lust das tatsächlich zu prüfen) auch bei Programmen möglich sein, die über eine Commandline-Steuerung verfügen, wenn da bei Programmende ein exit() mit dem entsprechenden Wert aufgerufen wird. Da kannst Du Dich aber nicht generell drauf verlassen, sondern musst in der Dokumentation des Programms nachschlagen oder es selbst testen.

Gruß,
Thorsten
 
Zurück
Oben