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

If- und else-Bedingung gleichzeitig erfüllt?

Frage Entwicklung Batch & Shell

Mitglied: Volker-A

Volker-A (Level 1) - Jetzt verbinden

07.08.2013, aktualisiert 02:09 Uhr, 1829 Aufrufe, 13 Kommentare, 6 Danke

Hi,
bei der Ausführung des folgenden Skriptes:
01.
if exist HierIstEinLeer zeichenEnthalten ( 
02.
   echo if ist true 
03.
) else ( 
04.
   echo else ist true 
05.
)
kommen mir Runzeln in die Stirn. Bzw. Tränen in die Augen. Dasselbe hier:
01.
set variable=HierIstEinLeer zeichenEnthalten 
02.
if exist %variable% ( 
03.
   echo if ist true 
04.
) else ( 
05.
   echo else ist true 
06.
)
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
Mitglied: Bitboy
07.08.2013, aktualisiert um 08:06 Uhr
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
Bitte warten ..
Mitglied: java667
07.08.2013 um 08:10 Uhr
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
Bitte warten ..
Mitglied: bastla
07.08.2013, aktualisiert um 08:21 Uhr
@ java667
Nur als Anmerkung: Die Existenz einer Variablen wird mit
if defined Variable
geprüft - "exist" dient, wie schon von Bitboy erwähnt, nur der Existenzprüfung von Ordnern und Dateien ..

Grüße
bastla
Bitte warten ..
Mitglied: bastla
07.08.2013, aktualisiert um 09:05 Uhr
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
Bitte warten ..
Mitglied: java667
07.08.2013 um 08:26 Uhr
Ok, guter Hinweis. Ich hatte in Batches Variablen bisher nie auf Existenz geprüft, daher war mir nicht klar, ob exist ggf. mehr kann. Ändert aber letztlich nichts daran, das das Script etwas Sinnfrei ist und auch als Beispiel nichts taugt.
Bitte warten ..
Mitglied: Endoro
07.08.2013, aktualisiert um 09:07 Uhr
Das Interessante ist, dass sich Variable, die Leerzeichen (oder Kommas/Semikolons) im Bezeichner enthalten, nicht mit DEFINED auf Existenz überprüfen lassen. So ergibt folgender Code:
01.
@ECHO OFF &SETLOCAL 
02.
SET "Meine Variable=true" 
03.
 
04.
IF DEFINED Meine Variable (ECHO DEFINED) ELSE ECHO NOT DEFINED 
05.
IF DEFINED "Meine Variable" (ECHO "DEFINED") ELSE ECHO NOT "DEFINED" 
06.
ECHO %Meine Variable%
.. als Output:
NOT "DEFINED" 
true
Das erste IF wird kommentar- und fehlerlos "übersprungen".

PS: es ist noch verwirrender, der folgende Code gibt als Output DEFINED aus:
01.
@ECHO OFF &SETLOCAL 
02.
FOR %%a IN ("mein test") DO ( 
03.
	SET "$%%~a=1" 
04.
	IF DEFINED $%%~a ECHO DEFINED 
05.
)
Falls jemand eine Erklärung hat, würde mich das sehr interessieren.
lg.
Bitte warten ..
Mitglied: AndreasHoster
07.08.2013, aktualisiert um 10:03 Uhr
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):
01.
D:\temp>Test.cmd 
02.
D:\temp>if exist HierIstEinLeer (echo if ist true )  else (echo else ist true ) 
03.
else ist true
Wie man sieht werden hier beide Codeblöcke als If/Else geparst und ebenso angezeigt.
Mit Leerzeichen:
01.
D:\temp>Test.cmd 
02.
D:\temp>if exist HierIstEinLeer zeichenEnthalten ( 
03.
D:\temp>echo if ist true 
04.
if ist true 
05.
D:\temp>echo else ist true 
06.
else ist true
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:
01.
   echo if ist true 
02.
) else ( 
03.
   echo else ist true 
04.
)
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.
Bitte warten ..
Mitglied: pieh-ejdsch
07.08.2013 um 10:04 Uhr
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
01.
> 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 
02.
$1 nicht definiert 
03.
$2 b nicht definiert 
04.
$1 ist gesetzt 
05.
$2 b ist gesetzt 
06.
$1 nicht definiert 
07.
 
08.
> 
Gruß Phil
Bitte warten ..
Mitglied: Endoro
07.08.2013 um 10:53 Uhr
Hallo Phil,
danke für diese Ausführungen, über die ich auch noch nachdenken muss.
Was mich verwunderte war, dass dieser Code funktioniert:
01.
for %%i in ("mein test1") do ( 
02.
	SET "$%%~i=1" 
03.
	if defined $%%~i (echo $%%~i ist gesetzt) else echo $%%~i nicht definiert 
04.
)
, dass es dieser nicht tut, fand ich dann nicht verwunderlich:
01.
for %%i in ("mein test1") do ( 
02.
	SET "$%%~i=1" 
03.
	if defined $%%~i (echo $%%~i ist gesetzt) else echo $%%~i nicht definiert 
04.
	SET "$mein test2=1" 
05.
	if defined $mein test2 (echo $mein test2 ist gesetzt) else echo $mein test2 nicht definiert 
06.
)
und das muss schon mit der anderen Erweiterung der Forschleifenparameter zusammenhängen, die ja auch irgendwie verzögert ist.
lg.
Bitte warten ..
Mitglied: Volker-A
07.08.2013 um 15:46 Uhr
@ Bitboy, bastla, Endoro, AndreasHoster, pieh-ejdsch: Vielen Dank!
Mein Held des Tages ist AndreasHoster ;)

Ich fasse das mal zusammen:
if exist/defined + Leerzeichen geht nicht; dies gilt für
- if-getesteten ausgeschriebenen Text,
- if-getestete Variablen, deren Inhalt Leerzeichen enthält,
- if-getesteten Variablen, deren Name Leerzeichen enthält,
jeweils unter der Bedingung, dass das if-Getestete nicht von Anführungszeichen umschlossen ist.
Die if-Anweisung wird offensichtlich übersprungen.
Die in Klammern stehende else-Anweisung wird offensichtlich ebenfalls übersprungen.
Dabei wird keine Fehlermeldung ausgegeben (was ich problematisch finde).
Man kann dieses Verhalten aufdecken, indem man das Skript ohne @echo off ausführt (ich weiß nicht, wie sich dieses Tracing oder Tracking bei Batches nennt).

Nochmal vielen Dank an alle Beteiligten!
Bitte warten ..
Mitglied: bastla
07.08.2013 um 16:17 Uhr
Hallo Volker-A!

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 "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
Bitte warten ..
Mitglied: Volker-A
07.08.2013 um 21:52 Uhr
Hallo bastla,

Danke für deinen Einspruch. Ich sehe das genauso wie du, weshalb ich "jeweils unter der Bedingung, dass das if-Getestete nicht von Anführungszeichen umschlossen ist" geschrieben hatte.

Das Problem tat sich auf, als ich eine Abfrageschleife geschrieben hatte, die einen Satz Dateien, deren Namen jeweils in derselben Variable an die Abfrage übermittelt wurden, verarbeiten sollte, wobei zunächst die Existenz der jeweiligen Datei überprüft werden sollte. Ich hatte anfänglich leichtsinnig ohne Anführungszeichen gearbeitet, was sich bei einem Test-Dateiensatz mit einfachen und kurzen Pfaden und Namen (etwa R:\1.txt usw.) nicht negativ bemerkbar gemacht hatte. Im realen Testlauf gab es aber gemischte Fälle - soll heißen: teilweise Pfade und Namen ohne Leerzeichen, teilweise welche mit. Es funktionierte also manchmal, aber manchmal eben auch nicht. Also hatte ich das Skript stückweise auseinandergenommen und dabei bemerkt, dass bei einem if-else-Test beide Bedingungen (wenn auch nur scheinbar, wie AndreasHoster so schön ausgeführt hat) true sind, wenn Leerzeichen im Testgut vorkommen.
Ich bin jetzt darauf sensibilisiert, auf Anführungszeichen zu achten. Weil ich nicht wusste, wie man Anführungszeichen aus einem String entfernt, hatte ich sie möglichst vermieden, um sie bedarfsweise einführen zu können, den String ansonsten aber ohne Anführungszeichen vorliegen zu haben. Ich habe jetzt meine Taktik geändert und benutze jetzt regelmäßig Anführungszeichen um Pfade und Namen, was auch die Arbeit mit anderen "Sonderzeichen" erleichtert, und entferne sie bedarfsweise. Dafür habe ich zwei hübsche Lösungen - übrigens hier im Forum, das mir gut gefällt - gefunden, nämlich die Ersetzung à la %variable:"=% (http://www.administrator.de/forum/sonder-zeichen-aus-variable-entfernen ...) und die for-Schleife mit Anführungszeichen als Delimiter (http://www.administrator.de/wissen/howto-for-schleife-mit-tokentrenner- ...). Bei dem einen Beitrag hat ein gewisser bastla mitgewirkt. Der Name könnte dir bekannt vorkommen ;) Und auch schöne Grüße an pieh-ejdsch vom anderen Beitrag ;)

Nochmal Danke an alle Beteiligten!

Grüße
Volker-A
Bitte warten ..
Mitglied: bastla
07.08.2013, aktualisiert um 22:03 Uhr
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:
01.
set "Beispiel=HierIstEinLeer zeichenEnthalten" 
02.
echo %Beispiel% 
03.
echo "%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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
C und C++
gelöst IF Abfrage funktioniert nicht mehr (2)

Frage von pablovic zum Thema C und C ...

Microsoft Office
Mehr als 20 Excel Dateien öffnen gleichzeitig (7)

Frage von PizzaPepperoni zum Thema Microsoft Office ...

JavaScript
gelöst Website nach Bedingung umleiten (6)

Frage von zeroblue2005 zum Thema JavaScript ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...