Top-Themen

Aktuelle Themen (A bis Z)

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?

Mitglied: Volker-A

Volker-A (Level 1) - Jetzt verbinden

07.08.2013, aktualisiert 02:09 Uhr, 1869 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:"=% (https://www.administrator.de/forum/sonder-zeichen-aus-variable-entfernen ...) und die for-Schleife mit Anführungszeichen als Delimiter (https://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 ..
Ähnliche Inhalte
Batch & Shell

Wert in Datei Suchen und if else Bedingung

Frage von trallerBatch & Shell4 Kommentare

Hallo, ich möchte ein kleines Bash-Script erstellen, welches prüft, ob ein bestimmter Text, welcher die Variable $suchtext ist, in ...

Batch & Shell

Cmd If ()else(if) geht nicht

gelöst Frage von SaschaaaaaBatch & Shell2 Kommentare

Hallo Leute, ich habe mir ein kleines Script erstellt welches den PC herunterfährt wenn er 90 Minuten im Leerlauf ...

Microsoft Office

Excel - Spalte löschen, wenn die Bedingung erfüllt ist

gelöst Frage von wingetMicrosoft Office4 Kommentare

Hallo zusammen, wer kann mir mit einem Makro für folgendes Problem helfen. 1.Beliebige Zeilen 2.Beliebige Spalten 3.Mehrere sheets (Blätter) ...

Batch & Shell

If Else mit Verschachtelung

gelöst Frage von soritoseBatch & Shell5 Kommentare

hallo ich versuche gerade eine suche zu schreiben mit einigen IF leider bekomme ich immer nur ein Syntaxfehler und ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 1 TagHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Alte Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 2 TagenRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 2 TagenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 3 TagenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Linux Netzwerk
Raspberry Pi 3: WLAN Power save deaktivieren
Frage von nordie92Linux Netzwerk14 Kommentare

Moin moin, mein Raspberry Pi 3 Model B benötigt eine dauerhaft aktive WLAN-Verbindung. Leider bricht die WLAN-Verbindung nach einigen ...

Netzwerkmanagement
Netzwerkmanagment im Haus mit Switch, Panel und pfsense
gelöst Frage von CorraggiounoNetzwerkmanagement13 Kommentare

hi zusammen, wir sind gerade dabei das ganze Haus bzw. die einzelnen Zimmer mit netzwerkdosen zu versorgen. Vom Keller ...

Vmware
Server 2008 r2 vmware terminalserver
Frage von MasterCVmware12 Kommentare

Guten Abend zusammen, ich hoffe , dass einer von euch mir weiterhelfen kann ,bei meinem kack Problem ! Ist ...

Google Android
Empfehlung: Android Ortungsapp
gelöst Frage von certifiedit.netGoogle Android12 Kommentare

Guten Morgen, grundsätzlich vorweg, ich wollte mich eben schlau machen, bzgl einer Ortungsapp, welche Androidbasiert einem anderen Androidsmartphone mitteilt, ...