Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

unverständlicher if-Abfrage-Fehler

Frage Entwicklung Batch & Shell

Mitglied: halo7one

halo7one (Level 1) - Jetzt verbinden

18.05.2008, aktualisiert 19.05.2008, 4599 Aufrufe, 14 Kommentare

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:
01.
if "%1"=="end" if not %2!==! ( 
02.
set "option=%2" 
03.
echo  w„hle:%2 (nach angegebenem Parameter^) 
04.
) 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:
01.
if "%end2%"=="ja" if not "%name2%"=="" ( 
02.
echo %endmessage% %name2% 
03.
%end-cmd2% 
04.
set "end2=" 
05.
if errorlevel=1 (echo !! Fehler !! 
06.
) else echo =^> fertig 
07.
echo ############################################################################### 
08.
echo. 
09.
) else echo ES KLAPPT!
ich habe zwar auch schon die Lösung des Problems gefunden: einfach 2 Klammern mehr
01.
if "%1"=="end" ( if not %2!==! ( 
02.
set "option=%2" 
03.
echo  w„hle:%2 (nach angegebenem Parameter^) 
04.
)) 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?
Mitglied: derJules
18.05.2008 um 19:57 Uhr
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...
Bitte warten ..
Mitglied: Biber
18.05.2008 um 19:59 Uhr
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.
01.
::------snipp testif.cmd-------- 
02.
@echo off & setlocal 
03.
if "%1"=="end" if not %2!==! ( 
04.
set "option=%2" 
05.
echo  wähle:%2 ^(nach angegebenem Parameter^) 
06.
) else set /p option= wähle:
Demo am CMD-Prompt:
01.
>testif end bla 
02.
 wähle:bla (nach angegebenem Parameter) 
03.
 
04.
(=19:52:52  d:\hfr\temp=) 
05.
>testif end 
06.
wähle:
Grüße
Biber
Bitte warten ..
Mitglied: TuXHunt3R
18.05.2008 um 22:06 Uhr
@ derJules

was ist denn das für eine Sprache?

Windows Batch. Noch nie gebraucht?
Bitte warten ..
Mitglied: halo7one
18.05.2008 um 23:29 Uhr
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.
01.
::------snipp 
02.
> testif.cmd-------- 
03.
> @echo off & setlocal 
04.
> if "%1"=="end" if not 
05.
> %2!==! ( 
06.
> set "option=%2" 
07.
> echo  wähle:%2 ^(nach angegebenem 
08.
> Parameter^) 
09.
> ) else set /p option= wähle: 
10.
> 

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:
01.
if "%1"=="end" if not %2!==! ( 
02.
set "option=%2" 
03.
echo  w„hle:%2 nach angegebenem Parameter 
04.
) else set /p option= w„hle:
trotzdem thx
Bitte warten ..
Mitglied: Biber
18.05.2008 um 23:47 Uhr
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
Bitte warten ..
Mitglied: halo7one
19.05.2008 um 00:39 Uhr
Was? das geht bei dir?
Wenn du eine bat-Datei mit folgendem Inhalt startest, dann kommt eine Eingabeaufforderung (set /p) zu Stande?:
01.
if "%1"=="end" if not %2!==! ( 
02.
set "option=%2" 
03.
echo  w„hle:%2 nach angegebenem Parameter 
04.
) else set /p option= w„hle:
also bei mir geht das nicht, und ich muss gerade feststellen, dass sogar dies nicht geht:
01.
if "test"=="end" (pause) else echo test 
02.
if "test"=="end" pause else echo test
(womit sich deine Frage nach dem Hochkomma-statt-kleines-ä-Codepage-Fehler erübrigt).

das geht aber:
01.
if "test"=="test" pause else echo test 
02.
 
03.
:: hier geht sogar alles!!! 
04.
if "%1"=="end" ( if not %2!==! ( 
05.
set "option=%2" 
06.
echo  w„hle:%2 (nach angegebenem Parameter^) 
07.
)) 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)
Bitte warten ..
Mitglied: bastla
19.05.2008 um 01:10 Uhr
Hallo halo7one!

Falls es Dich interessiert: Bei mir funktioniert
01.
@echo off & setlocal 
02.
if "%1"=="end" if not %2!==! ( 
03.
    set "option=%2" 
04.
    echo  w„hle:%2 nach angegebenem Parameter 
05.
) else set /p option= w„hle: 
06.
echo Option: %option%
und
01.
if "test"=="end" (pause) else echo test
sowie
01.
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:
01.
if "%~1"=="end" if not %2!==! (
bzw (im Hinblick auf die "!")
01.
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
01.
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:
01.
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
Bitte warten ..
Mitglied: halo7one
19.05.2008 um 12:33 Uhr
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
Bitte warten ..
Mitglied: halo7one
19.05.2008 um 16:51 Uhr
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?:
01.
@echo off & setlocal 
02.
if "%~1"=="end" if not "%~2"=="" ( 
03.
    set "option=%~2" 
04.
    echo  w„hle:%~2 ^(nach angegebenem Parameter^) 
05.
) else set /p option= w„hle: 
06.
echo Option: %option% 
07.
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:
01.
@echo off & setlocal 
02.
if "%~1"=="end" if not "%~2"=="" ( 
03.
    set "option=%~2" 
04.
    echo  w„hle:%~2 ^(nach angegebenem Parameter^) 
05.
    goto:EingabeOK 
06.
)  
07.
set /p option= w„hle: 
08.
:EingabeOK 
09.
echo Option: %option% 
10.
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.

Mit freundlichen Grüßen,
halo7one
Bitte warten ..
Mitglied: bastla
19.05.2008 um 17:23 Uhr
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
01.
if "%~2" neq "" ( 
02.
  set "option=%~2" 
03.
  echo  w„hle:%~2 ^(nach angegebenem Parameter^) 
04.
) 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
Bitte warten ..
Mitglied: halo7one
19.05.2008 um 20:10 Uhr
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
Bitte warten ..
Mitglied: miniversum
19.05.2008 um 20:53 Uhr
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:
01.
@echo off & setlocal 
02.
if "%~1"=="end" if not "%~2"=="" ( 
03.
    set "option=%~2" 
04.
    echo  w„hle:%~2 ^(nach angegebenem Parameter^) 
05.
    goto:EingabeOK 
06.
)  
07.
set /p option= w„hle: 
08.
:EingabeOK 
09.
echo Option: %option% 
10.
pause
Damit hast du ja "indirekt" ein else was du auf beleibeg viele, auch anders kombinierte If-Konstruktionen anwenden kannst.
Bitte warten ..
Mitglied: bastla
19.05.2008 um 22:16 Uhr
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
Bitte warten ..
Mitglied: halo7one
19.05.2008 um 23:39 Uhr
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 ;) & Mit freundlichen Grüßen,
halo7one
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Datenbanken
gelöst IF Abfrage im SELECT Oracle SQL (2)

Frage von Roadrunner777 zum Thema Datenbanken ...

C und C++
gelöst Fehler bei if (Csharp) (7)

Frage von homeroma zum Thema C und C ...

Datenbanken
gelöst Fehler bei SQL Abfrage - Filter Funktion (2)

Frage von mschaedler1982 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...