If- und else-Bedingung gleichzeitig erfüllt?
Hi,
bei der Ausführung des folgenden Skriptes:
kommen mir Runzeln in die Stirn. Bzw. Tränen in die Augen. Dasselbe hier:
Ich verstehe nicht, wie if und else gleichzeitig wahr sein können. Kann mir das bitte jemand erklären?
Bin gespannt wie ein Flitzebogen!
Danke,
Volker-A
bei der Ausführung des folgenden Skriptes:
1
2
3
4
5
2
3
4
5
if exist HierIstEinLeer zeichenEnthalten (
echo if ist true
) else (
echo else ist true
)
1
2
3
4
5
6
2
3
4
5
6
set variable=HierIstEinLeer zeichenEnthalten
if exist %variable% (
echo if ist true
) else (
echo else ist true
)
Bin gespannt wie ein Flitzebogen!
Danke,
Volker-A
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 213537
Url: https://administrator.de/forum/if-und-else-bedingung-gleichzeitig-erfuellt-213537.html
Ausgedruckt am: 17.04.2025 um 04:04 Uhr
13 Kommentare
Neuester Kommentar
Hi,
Ich nehm mal an dass es daran liegt dass "exist" für Dateien und Ordner gedacht ist.
Falls du prüfen willst ob die Variable Inhalt hat kannst du das so machen
set variable=HierIstEinLeer zeichenEnthalten
if NOT "%variable%" == "" (
echo if ist true, Variable hat Inhalt
) else (
echo else ist true, Variable hat keinen Inhalt
)
pause
Ich nehm mal an dass es daran liegt dass "exist" für Dateien und Ordner gedacht ist.
Falls du prüfen willst ob die Variable Inhalt hat kannst du das so machen
set variable=HierIstEinLeer zeichenEnthalten
if NOT "%variable%" == "" (
echo if ist true, Variable hat Inhalt
) else (
echo else ist true, Variable hat keinen Inhalt
)
pause
Hi,
ich glaube du hast den Code nicht verstanden:
if exist %variable% = prüft ob die Variable die oben über set gesetzt wird existiert
danach gibt das Script ein echo Befehl aus. In deinem Fall echo if ist true. Da könnte aber auch stehen: echo Heute regnet es
Falls die Variable nicht existiert, gibt es noch eine else Bedingung. In diesem Beispiel wird aber else niemals ausgeführt, da die Variable oben ja gesetzt wird und somit immer vorhanden ist.
Somit ist das Script in seiner jetzigen Form unsinnig und taugt nicht wirklich als Beispiel.
Gruss,
Java
ich glaube du hast den Code nicht verstanden:
if exist %variable% = prüft ob die Variable die oben über set gesetzt wird existiert
danach gibt das Script ein echo Befehl aus. In deinem Fall echo if ist true. Da könnte aber auch stehen: echo Heute regnet es
Falls die Variable nicht existiert, gibt es noch eine else Bedingung. In diesem Beispiel wird aber else niemals ausgeführt, da die Variable oben ja gesetzt wird und somit immer vorhanden ist.
Somit ist das Script in seiner jetzigen Form unsinnig und taugt nicht wirklich als Beispiel.
Gruss,
Java
Hallo volker-A und willkommen im Forum!
Abgesehen von allen anderen Hinweisen: Da sich in Deinem überprüften String ein Leerzeichen befindet (das in Batch als Default-Trennzeichen gilt) wäre dieser String zumindest unter Anführungszeichen zu setzen - und dann bekommst Du auch nur noch das zu erwartende (außer Du hättest tatsächlich im aktuellen Pfad eine Datei/einen Ordner mit dem Namen "HierIstEinLeer zeichenEnthalten"
) Ergebnis "else ist true" ...
Was willst Du eigentlich genau prüfen?
Grüße
bastla
Abgesehen von allen anderen Hinweisen: Da sich in Deinem überprüften String ein Leerzeichen befindet (das in Batch als Default-Trennzeichen gilt) wäre dieser String zumindest unter Anführungszeichen zu setzen - und dann bekommst Du auch nur noch das zu erwartende (außer Du hättest tatsächlich im aktuellen Pfad eine Datei/einen Ordner mit dem Namen "HierIstEinLeer zeichenEnthalten"
Was willst Du eigentlich genau prüfen?
Grüße
bastla
Das Interessante ist, dass sich Variable, die Leerzeichen (oder Kommas/Semikolons) im Bezeichner enthalten, nicht mit
.. als Output:
Das erste
PS: es ist noch verwirrender, der folgende Code gibt als Output
Falls jemand eine Erklärung hat, würde mich das sehr interessieren.
lg.
DEFINED
auf Existenz überprüfen lassen. So ergibt folgender Code:1
2
3
4
5
6
2
3
4
5
6
@ECHO OFF &SETLOCAL
SET "Meine Variable=true"
IF DEFINED Meine Variable (ECHO DEFINED) ELSE ECHO NOT DEFINED
IF DEFINED "Meine Variable" (ECHO "DEFINED") ELSE ECHO NOT "DEFINED"
ECHO %Meine Variable%
NOT "DEFINED"
true
IF
wird kommentar- und fehlerlos "übersprungen".PS: es ist noch verwirrender, der folgende Code gibt als Output
DEFINED
aus:1
2
3
4
5
2
3
4
5
@ECHO OFF &SETLOCAL
FOR %%a IN ("mein test") DO (
SET "$%%~a=1"
IF DEFINED $%%~a ECHO DEFINED
)
lg.
Es werden nicht if und else gleichzeitig ausgeführt, es sieht nur so aus.
Durch Dein Konstrukt mit dem Leerzeichen, werden die Blöcke nicht mehr als zum IF gehörend geparst.
Ausgabe ohne Leerzeichen (Code steckt in der Batch):
Wie man sieht werden hier beide Codeblöcke als If/Else geparst und ebenso angezeigt.
Mit Leerzeichen:
Man sieht deutlich, daß für den Parser das IF Statement mit dem ( endet.
Passt ja auch zur Definition von IF:
IF EXIST filename command
Den Filenamen (HierIstEinLeer) findet er nicht, damit wird das Kommand zeichenEnthalten ( nicht ausgeführt und produziert auch keine Fehlermeldung.
Danach wird der restliche Code abgearbeitet, also folgendes:
Und hier wird von oben nach unten abgearbeitet, das else ignoriert, weil Befehle zwischen ) und ( wohl ignoriert werden (laut meinem Test, dokumentiert habe ich das nicht gefunden) und dann wird auch das zweite echo abgearbeitet.
Also, er macht genau das, was Du ihm sagst, daß Du der Meinung bist was anderes zu meinen, interessiert den Computer herzlich wenig.
Durch Dein Konstrukt mit dem Leerzeichen, werden die Blöcke nicht mehr als zum IF gehörend geparst.
Ausgabe ohne Leerzeichen (Code steckt in der Batch):
1
2
3
2
3
D:\temp>Test.cmd
D:\temp>if exist HierIstEinLeer (echo if ist true ) else (echo else ist true )
else ist true
Mit Leerzeichen:
1
2
3
4
5
6
2
3
4
5
6
D:\temp>Test.cmd
D:\temp>if exist HierIstEinLeer zeichenEnthalten (
D:\temp>echo if ist true
if ist true
D:\temp>echo else ist true
else ist true
Passt ja auch zur Definition von IF:
IF EXIST filename command
Den Filenamen (HierIstEinLeer) findet er nicht, damit wird das Kommand zeichenEnthalten ( nicht ausgeführt und produziert auch keine Fehlermeldung.
Danach wird der restliche Code abgearbeitet, also folgendes:
1
2
3
4
2
3
4
echo if ist true
) else (
echo else ist true
)
Also, er macht genau das, was Du ihm sagst, daß Du der Meinung bist was anderes zu meinen, interessiert den Computer herzlich wenig.
moin Endoro,
Die Prüfung auf das Vorhandensein einer Variable hat nichts mit delayedexpansion zu tun. Der Interpreter weis ja das die Variable gesetzt wurde. Daher kannst Du in Schleifen bzw Klammern leichter auf das Prüfen von vorhandenen Variablen zugreifen im Gegensatz dazu der Zugriff auf den Inhalt dieser Variable.
Test in der CMD-Line
Gruß Phil
Die Prüfung auf das Vorhandensein einer Variable hat nichts mit delayedexpansion zu tun. Der Interpreter weis ja das die Variable gesetzt wurde. Daher kannst Du in Schleifen bzw Klammern leichter auf das Prüfen von vorhandenen Variablen zugreifen im Gegensatz dazu der Zugriff auf den Inhalt dieser Variable.
Test in der CMD-Line
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
> for %i in (1 "2 b" 1 "2 b" 1) do @(if defined $%~i (set "$%~i=") else set "$%~i=x") & if defined $%~i (echo $%~i ist gesetzt) else echo $%~i nicht definiert
$1 nicht definiert
$2 b nicht definiert
$1 ist gesetzt
$2 b ist gesetzt
$1 nicht definiert
>
Gruß Phil
Hallo Phil,
danke für diese Ausführungen, über die ich auch noch nachdenken muss.
Was mich verwunderte war, dass dieser Code funktioniert:
, dass es dieser nicht tut, fand ich dann nicht verwunderlich:
und das muss schon mit der anderen Erweiterung der Forschleifenparameter zusammenhängen, die ja auch irgendwie verzögert ist.
lg.
danke für diese Ausführungen, über die ich auch noch nachdenken muss.
Was mich verwunderte war, dass dieser Code funktioniert:
1
2
3
4
2
3
4
for %%i in ("mein test1") do (
SET "$%%~i=1"
if defined $%%~i (echo $%%~i ist gesetzt) else echo $%%~i nicht definiert
)
1
2
3
4
5
6
2
3
4
5
6
for %%i in ("mein test1") do (
SET "$%%~i=1"
if defined $%%~i (echo $%%~i ist gesetzt) else echo $%%~i nicht definiert
SET "$mein test2=1"
if defined $mein test2 (echo $mein test2 ist gesetzt) else echo $mein test2 nicht definiert
)
lg.
Hallo Volker-A!
Einspruch zumindest gegen
... was mich übrigens nochmals auf die (schon oben gestellte) Frage zurück führt, was Du eigentlich abfragen wolltest ...
Grüße
bastla
Einspruch zumindest gegen
if exist/defined + Leerzeichen geht nicht; dies gilt für
- if-getesteten ausgeschriebenen Text,
- if-getestete Variablen, deren Inhalt Leerzeichen enthält,
- unter Verwendung von Anführungszeichen kannst Du sehr wohl Text (egal ob unmittelbar oder als Variableninhalt), der Leerzeichen enthält, vergleichen, auch in Bezug auf Dateinamen (mit "- if-getesteten ausgeschriebenen Text,
- if-getestete Variablen, deren Inhalt Leerzeichen enthält,
exist
"). Auch funktioniert ein "if defined
", wenn im Variableninhalt Leerzeichen vorkommen ...... was mich übrigens nochmals auf die (schon oben gestellte) Frage zurück führt, was Du eigentlich abfragen wolltest ...
Grüße
bastla
Hallo Volker-A!
Ich nehme grundsätzlich die Anführungszeichen nicht in die Variable auf, sondern füge sie bei der Verwendung hinzu - dann brauchen sie auch im Fall des Falles nicht entfernt zu werden
- Beispiel:
Die umgebenden Anführungszeichen in der ersten Zeile dienen vor allem der klaren Abgrenzung (öfter als einmal hat schon ein irrtümlich am Ende des Strings hinzugefügtes Leerzeichen gestört) und natürlich dem "Entschärfen" von Sonderzeichen.
Grüße
bastla
Ich nehme grundsätzlich die Anführungszeichen nicht in die Variable auf, sondern füge sie bei der Verwendung hinzu - dann brauchen sie auch im Fall des Falles nicht entfernt zu werden
1
2
3
2
3
set "Beispiel=HierIstEinLeer zeichenEnthalten"
echo %Beispiel%
echo "%Beispiel%"
Grüße
bastla