unverständlicher if-Abfrage-Fehler
if ... if not ... () funktioniert nicht (immer)?
Hi @ all,
ich habe ein Problem mit einer if-Abfrage und kann mir nicht erklären, warum diese in einem Fall funktioniert und im anderen nicht...
dies geht nicht:
Anmerkung: die Klammern beim echo spielen keine Rolle,
genau so " oder andere Zeichen als ! bei der if-Abfrage (z.B. if not "%2x"=="x"),
das Problem liegt nur bei den beiden if's ZUSAMMEN, der Rest geht!
dies funktioniert hingegen:
ich habe zwar auch schon die Lösung des Problems gefunden: einfach 2 Klammern mehr
ich kann mir jedoch nicht erklären, was an diesen beiden if-Abfragen so unterschiedlich sein soll?!
Also an alle die sich damit gut auskennen: Warum funktioniert die if-Abfrage einmal ohne Extra-Klammern und einmal nur mit diesen?
Hi @ all,
ich habe ein Problem mit einer if-Abfrage und kann mir nicht erklären, warum diese in einem Fall funktioniert und im anderen nicht...
dies geht nicht:
if "%1"=="end" if not %2!==! (
set "option=%2"
echo w„hle:%2 (nach angegebenem Parameter^)
) else set /p option= w„hle:
genau so " oder andere Zeichen als ! bei der if-Abfrage (z.B. if not "%2x"=="x"),
das Problem liegt nur bei den beiden if's ZUSAMMEN, der Rest geht!
dies funktioniert hingegen:
if "%end2%"=="ja" if not "%name2%"=="" (
echo %endmessage% %name2%
%end-cmd2%
set "end2="
if errorlevel=1 (echo !! Fehler !!
) else echo =^> fertig
echo ###############################################################################
echo.
) else echo ES KLAPPT!
ich habe zwar auch schon die Lösung des Problems gefunden: einfach 2 Klammern mehr
if "%1"=="end" ( if not %2!==! (
set "option=%2"
echo w„hle:%2 (nach angegebenem Parameter^)
)) else set /p option= w„hle:
Also an alle die sich damit gut auskennen: Warum funktioniert die if-Abfrage einmal ohne Extra-Klammern und einmal nur mit diesen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 87888
Url: https://administrator.de/contentid/87888
Ausgedruckt am: 20.11.2024 um 02:11 Uhr
14 Kommentare
Neuester Kommentar
was ist denn das für eine Sprache?
Ich würde einfach mal behaupten, es liegt ganz einfach an der Sprachsyntax - für mich klingt's irgenwie logisch, dass man in diversen programmiersprachen den if-Verarbeitungsteil in Klammern setzten muss - und dass machst du ja im ersten nicht, da hat das erste if ja keine klammern...
Ich würde einfach mal behaupten, es liegt ganz einfach an der Sprachsyntax - für mich klingt's irgenwie logisch, dass man in diversen programmiersprachen den if-Verarbeitungsteil in Klammern setzten muss - und dass machst du ja im ersten nicht, da hat das erste if ja keine klammern...
Moin halo7one,
Du hast nur die schließende runde Klammer in Zeile 3 maskiert, nicht die öffnende.
Wenn Du das nachholst, dann sollte es gehen.
Demo am CMD-Prompt:
Grüße
Biber
Du hast nur die schließende runde Klammer in Zeile 3 maskiert, nicht die öffnende.
Wenn Du das nachholst, dann sollte es gehen.
::------snipp testif.cmd--------
@echo off & setlocal
if "%1"=="end" if not %2!==! (
set "option=%2"
echo wähle:%2 ^(nach angegebenem Parameter^)
) else set /p option= wähle:
Demo am CMD-Prompt:
>testif end bla
wähle:bla (nach angegebenem Parameter)
(=19:52:52 d:\hfr\temp=)
>testif end
wähle:
Grüße
Biber
Moin halo7one,
auch Dein jetzt gepostetes Beispiel läuft bei mir ohne Probleme.
Egal ob ohne, mit einem oder mit zwei Parametern aufgerufen.
Frage: wenn dieser Zweig aufgerufen wird mit Parameter %1 gleich "end" -was steht dann in %2?
Oder bringen die bei Dir angezeigten Hochkomma-statt-kleines-ä-Codepage-Fehler den Batch bei Dir durcheinander? Tritt dieser Fehler bei Dir auch auf, wenn Du testweise "waehle" statt "wähle" schreibst?
Grüße
Biber
auch Dein jetzt gepostetes Beispiel läuft bei mir ohne Probleme.
Egal ob ohne, mit einem oder mit zwei Parametern aufgerufen.
Frage: wenn dieser Zweig aufgerufen wird mit Parameter %1 gleich "end" -was steht dann in %2?
Oder bringen die bei Dir angezeigten Hochkomma-statt-kleines-ä-Codepage-Fehler den Batch bei Dir durcheinander? Tritt dieser Fehler bei Dir auch auf, wenn Du testweise "waehle" statt "wähle" schreibst?
Grüße
Biber
Hallo halo7one!
Falls es Dich interessiert: Bei mir funktioniert
und
sowie
jeweils wie vorgesehen (wobei ich allerdings für die Abfrage nach %2 anstelle von "!" trotzdem eher ein oder zwei andere Zeichen verwenden würde - vielleicht brauchst Du ja auch noch "delayedexpansion" ...).
Damit ggf beim Aufruf "end" auch tatsächlich unter Anführungszeichen geschrieben werden kann, wäre noch folgende Änderung zu empfehlen:
bzw (im Hinblick auf die "!")
Nun aber noch zu Deiner ursprünglichen Frage hinsichtlich des zusätzlichen Klammernpaares:
schreibst, bezieht sich das "else" auf das zweite "if" (also die Abfrage nach Parameter 2). Verwendest Du jedoch folgende Schreibweise:
gilt das "else" für das erste "if", also für die Frage, ob "end" als erster Parameter übergeben wurde.
Grüße
bastla
Falls es Dich interessiert: Bei mir funktioniert
@echo off & setlocal
if "%1"=="end" if not %2!==! (
set "option=%2"
echo w„hle:%2 nach angegebenem Parameter
) else set /p option= w„hle:
echo Option: %option%
if "test"=="end" (pause) else echo test
if "test"=="test" (pause) else echo test
Damit ggf beim Aufruf "end" auch tatsächlich unter Anführungszeichen geschrieben werden kann, wäre noch folgende Änderung zu empfehlen:
if "%~1"=="end" if not %2!==! (
if "%~1"=="end" if not "%~2"=="" (
ich kann mir jedoch nicht erklären, was an diesen beiden if-Abfragen so unterschiedlich sein soll?!
Wenn Duif "%1"=="end" if not %2!==! (
if "%1"=="end" ( if not %2!==! (
Grüße
bastla
Hallo halo7one!
So ganz sicher bin ich nicht, was Du im Detail bezweckst - eigentlich verstehe ich es so: Wenn %2 nicht vorhanden ist (egal, ob es %1 gibt oder nicht, und ob %1 "end" enthält), muss eine Eingabe erfolgen - dann genügt aber im Prinzip
In Deinem letzten Batch unterstellst Du aber, dass für den Fall, dass als %1 "end" übergeben wurde, %2 auch vorhanden wäre (%para% ist ja schon vor der Abfrage nach %2 "true" und kann nicht mehr "false" werden).
Was soll eigentlich geschehen, wenn %1 einen anderen Wert als "end" enthält, bzw, etwas allgemeiner formuliert: Wie geht es nach diesem Block weiter?
Grüße
bastla
So ganz sicher bin ich nicht, was Du im Detail bezweckst - eigentlich verstehe ich es so: Wenn %2 nicht vorhanden ist (egal, ob es %1 gibt oder nicht, und ob %1 "end" enthält), muss eine Eingabe erfolgen - dann genügt aber im Prinzip
if "%~2" neq "" (
set "option=%~2"
echo w„hle:%~2 ^(nach angegebenem Parameter^)
) else set /p option= w„hle:
Was soll eigentlich geschehen, wenn %1 einen anderen Wert als "end" enthält, bzw, etwas allgemeiner formuliert: Wie geht es nach diesem Block weiter?
Grüße
bastla
Fällt dir dafür noch eine andere Möglichkeit ein? Oder anders gesagt: ist es möglich 2 if's einem else zuzuordnen?
Versuchs mal so:
@echo off & setlocal
if "%~1"=="end" if not "%~2"=="" (
set "option=%~2"
echo w„hle:%~2 ^(nach angegebenem Parameter^)
goto:EingabeOK
)
set /p option= w„hle:
:EingabeOK
echo Option: %option%
pause
Hallo halo7one!
Da Du ja aber eigentlich eine UND-Verknüpfung zu suchen scheinst, sollte miniversums Version letztlich passen.
Grüße
bastla
... wurde korrigiert
Nicht wirklich - jetzt ist es so, wie von mir beschrieben: Es kommt nur noch auf %2 an, und dann könntest Du %para% auch einsparen und unmittelbar die beiden Zweige verwenden.Da Du ja aber eigentlich eine UND-Verknüpfung zu suchen scheinst, sollte miniversums Version letztlich passen.
Grüße
bastla