halo7one
Goto Top

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:
if "%1"=="end" if not %2!==! (  
set "option=%2"  
echo  w„hle:%2 (nach angegebenem Parameter^)
) else set /p option= w„hle:
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:
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:
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?

Content-Key: 87888

Url: https://administrator.de/contentid/87888

Printed on: April 20, 2024 at 08:04 o'clock

Member: derJules
derJules May 18, 2008 at 17:57:19 (UTC)
Goto Top
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...
Member: Biber
Biber May 18, 2008 at 17:59:27 (UTC)
Goto Top
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.
::------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
Member: TuXHunt3R
TuXHunt3R May 18, 2008 at 20:06:17 (UTC)
Goto Top
@ derJules

was ist denn das für eine Sprache?

Windows Batch. Noch nie gebraucht?
Member: halo7one
halo7one May 18, 2008 at 21:29:19 (UTC)
Goto Top
nabend...

@ 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:
> 

Danke für die Überlegung, doch ich dachte ich hätte mit meiner Anmerkung diese Antworten verhindert, da ich wusste, dass jemand den Fehler bei diesen Klammern sucht:
Anmerkung: die Klammern beim echo spielen keine Rolle,
Das bedeutet, dass auch dies nicht funktioniert:
if "%1"=="end" if not %2!==! (  
set "option=%2"  
echo  w„hle:%2 nach angegebenem Parameter
) else set /p option= w„hle:

trotzdem thx
Member: Biber
Biber May 18, 2008 at 21:47:38 (UTC)
Goto Top
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
Member: halo7one
halo7one May 18, 2008 at 22:39:17 (UTC)
Goto Top
Was? das geht bei dir?
Wenn du eine bat-Datei mit folgendem Inhalt startest, dann kommt eine Eingabeaufforderung (set /p) zu Stande?:
if "%1"=="end" if not %2!==! (  
set "option=%2"  
echo  w„hle:%2 nach angegebenem Parameter
) else set /p option= w„hle:

also bei mir geht das nicht, und ich muss gerade feststellen, dass sogar dies nicht geht:
if "test"=="end" (pause) else echo test  
if "test"=="end" pause else echo test  
(womit sich deine Frage nach dem Hochkomma-statt-kleines-ä-Codepage-Fehler erübrigt).

das geht aber:
if "test"=="test" pause else echo test  

:: hier geht sogar alles!!!
if "%1"=="end" ( if not %2!==! (  
set "option=%2"  
echo  w„hle:%2 (nach angegebenem Parameter^)
)) else set /p option= w„hle:

Der Fehler liegt also beim else! Also: WARUM funktioniert else (bei mir) nicht richtig?
Ich mein wie sollte ich den letzten Code denn anders schreiben?

Wenn genau das so bei dir klappt dann hab ich ein Stapelverarbeitungs-Bug, was dann wohl die letzte logische Erklärung wäre, oder?
Wenn ja, wie schaffe ich diesen Bug aus der Welt? (bitte nicht formatieren, reparieren würde ich auch nur ungern)
Member: bastla
bastla May 18, 2008 at 23:10:47 (UTC)
Goto Top
Hallo halo7one!

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%
und
if "test"=="end" (pause) else echo test  
sowie
if "test"=="test" (pause) else echo test  
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:
if "%~1"=="end" if not %2!==! (  
bzw (im Hinblick auf die "!")
if "%~1"=="end" if not "%~2"=="" (  
Nun aber noch zu Deiner ursprünglichen Frage hinsichtlich des zusätzlichen Klammernpaares:
ich kann mir jedoch nicht erklären, was an diesen beiden if-Abfragen so unterschiedlich sein soll?!
Wenn Du
if "%1"=="end" if not %2!==! (  
schreibst, bezieht sich das "else" auf das zweite "if" (also die Abfrage nach Parameter 2). Verwendest Du jedoch folgende Schreibweise:
if "%1"=="end" ( if not %2!==! (  
gilt das "else" für das erste "if", also für die Frage, ob "end" als erster Parameter übergeben wurde.

Grüße
bastla
Member: halo7one
halo7one May 19, 2008 at 10:33:23 (UTC)
Goto Top
Moin Bastla,
NUN BIN ICH TOTAL GENERFT!!!!! Ich habe gerade die Antwort auf dieses Problem wunderbar ausführlich posten wollen. Doch als ich den Beitrag senden wollte MUSSTE ICH MICH NEU ANMELDEN = ICH KANN DEN BEITRAG NOCHMAL SCHREIBEN!!!!!!

Da ich jetzt aber absolut keinen Bock mehr darauf habe bitte ich euch (vor allem dich Bastla):
Wartet auf meinen Beitrag bevor ihr etwas schreibt!
Es kann ne Weile dauern, bis ich 1. wieder die entnerft bin und Zeit habe sowie 2. den Beitrag wieder zusammen bekommen habe.

Bis dahin verfluche ich den relogin, Firefox (keine Formulardaten gespeichert) und mich, da ich nicht manuell gesichert habe XD

So gebe ich jedem, der einen längeren Beitrag schreibt den Rat: ZWISCHENSPEICHERN!!!!

Mit schlechter Laune,
halo7one
Member: halo7one
halo7one May 19, 2008 at 14:51:28 (UTC)
Goto Top
Moin Bastla,
Erst mal danke für die Erklärung, Meine Klammern-frage wäre damit geklärt

Auch die simple if...else Abfrage funktioniert nun bei mir wieder!
Also: wenn bei jemandem einmal etwas nicht funktioniert, als erstes den PC neustarten ;)

Nun war meine Idee bei der (folgenden) if-Abfage jedoch, dass sich das else auf beide if's bezieht, was jedoch so nicht möglich ist, oder?:
@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%
pause
Beschreibung: das else bezieht sich hier nur auf das 2. if! (Wenn ich die Zusatzklammer einbaue, bezieht es sich nur auf das 1. if.)
1. Fall: kein Parameter = Da die 1. if-Abfrage negativ ist, wird die 2. gar nicht erst ausgeführt und somit auch nicht das else, was jedoch meine Idee war. (bei Zusatzklammer: else wird ausgeführt)
2. Fall: nur 1. Parameter = Die 1. if-Abfrage ist positiv, wodurch die 2. ausgeführt wird. Da die 2. if-Abfrage negativ ist, wird korrekt an das else weitergegeben. (bei Zusatzklammer: else wird nicht ausgeführt, da es sich nur auf 1. if bezieht)
3. Fall: beide Parameter = Da die 1. if-Abfrage positiv ist, wird auch die 2. ausgeführt. Diese ist ebenfalls positiv, wodurch die Befehle in er Klammer ausgeführt werden.

Da sich das else wohl immer nur auf ein if bezieht, muss man diese doppelte if-Abfrage umgehen, was z.B. so wie bei miniversums Post (siehe weiter unten) aussehen könnte:
@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

@ Bastla: würdest du bitte die 3 Fälle überprüfen (ob bei mir auch alles wieder normal funktionier)... oder evtl. fällt dir ja noch eine andere Möglichkeit ein.

MfG,
halo7one
Member: bastla
bastla May 19, 2008 at 15:23:41 (UTC)
Goto Top
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
if "%~2" neq "" (  
  set "option=%~2"  
  echo  w„hle:%~2 ^(nach angegebenem Parameter^)
) else set /p option= w„hle:
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
Member: halo7one
halo7one May 19, 2008 at 18:10:54 (UTC)
Goto Top
Hi Bastla,
ganz einfach: wenn einer der beiden Parameter nicht richtig gesetzt ist, soll die Eingabe erfolgen.

Mit der Variante mit %para% hast du recht, ich habe das else vergessen (musste ich mir ja neu zusammenbasteln... da hab ich was vergessen) =>wurde korrigiert

Fällt dir dafür noch eine andere Möglichkeit ein? Oder anders gesagt: ist es möglich 2 if's einem else zuzuordnen?

Gruß,
halo7one
Member: miniversum
miniversum May 19, 2008 at 18:53:53 (UTC)
Goto Top
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
Damit hast du ja "indirekt" ein else was du auf beleibeg viele, auch anders kombinierte If-Konstruktionen anwenden kannst.
Member: bastla
bastla May 19, 2008 at 20:16:58 (UTC)
Goto Top
Hallo halo7one!

... 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
Member: halo7one
halo7one May 19, 2008 at 21:39:49 (UTC)
Goto Top
ok ok ich bin 2. auf die gleiche Falle reingefallen -_-

Nun werde ich miniversums Version nehmen, womit alles geklärt wäre!

Falls noch jemand eine andere Lösung hat (sowas wie ein UND: if ... AND if... else ...), würde ich mich sehr darüber freuen...

Also abschließend ein DICKES DANKE an Bastla und miniversum!

Bis zum nächsten Problem ;) & MfG,
halo7one