ludger
Goto Top

IF defined ELSE funktioniert nicht in Batchanweisung

Hallo

mir ist in den letzten Tagen von Bastla sehr gut geholfen worden. Jetzt kam noch eine weitere Funktionsanforderung die eigentlich sehr einfach erschien. Leider klappt das nicht ganz. Ich denke das Problem liegt daran, daß ich die Bedeutung einzelner Zeilen von Bastla nicht verstehe.

Ich habe eine Batchdatei die nach Eingabe einer Zahl in einem festgelegten Ordner die Datei sucht, die mit der Zahl (vierstellig) beginnt.
Also Eingabe z.B. 53 Suche nach C:\Dokumente\0053*.*
Die erste gefundene Datei wird geöffnet. Soweit ist alles ok.


Jetzt soll aber wenn die Datei nicht gefunden wurde eine Vorlage geöffnet werden.

Hier ist mein Versuch.

@echo off & setlocal
set "Basis=M:\Dokumente"
set /p nummer=Bitte die Dokumentnummer eingeben:
set "Nr=0000%nummer%"
set "Nr=%Nr:~-4%"
set datei=
for /f "delims=" %%i in ('dir /b "%Basis%\%Nr%*.*"') do set "datei=%Basis%\%%i"

if defined datei (%datei%) else (M:\Dokumente\Vorlage.doc)

Was mache ich falsch?

Der Fehler muß in der letzten Zeile liegen.
Wenn die Datei exisitiert, wird sie geöffnet.
Wenn die Datei nicht existiert passiert nichts.

Danke im voraus für jeden Tip
Ich arbeite mit Windows XP Proffesional Version 2002 Service Pack 3

Ludger

Content-ID: 117457

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

Biber
Biber 04.06.2009 um 12:17:52 Uhr
Goto Top
Moin Ludger,

ohne bastla vorgreifen zu wollen (wahrscheinlich überholt er mich eh' gleich wieder von rechts):

Ja, das Problem liegt in der letzten Zeile...
if defined datei (%datei%) else (M:\Dokumente\Vorlage.doc)
Wenn die Variable %datei% nicht gesetzt ist, sieht die Zeile "bei Ausführung" so aus:
if defined datei ( ) else (M:\Dokumente\Vorlage.doc)
... und das Problem ist dann das fehlende Argument in der Klammer/die leere Klammer.

Ich würde der Diskussion mit der CMD.exe, ob denn ein leeres Argument auch ein Argument ist etc
aus dem Wege gehen und die Prüfung so umstellen

..
...
if NOT defined datei Set "datei=M:\Dokumente\Vorlage.doc"  
 %datei%
REM .... oder [start "Fenstertitel" "%datei%" ]   
REM ... oder welcher Aufruf auch immer...
....

Grüße
Biber
77559
77559 04.06.2009 um 12:22:04 Uhr
Goto Top
Moin Ludger,

ich vermute mal das der Befel
set datei=
ein Leerzeichen am Ende hat, dann ist er trotzdem definiert.
Um sicher zu gehen ändere de Zeile mal in
If defined datei set "datei="

Falls das nicht hilft, könntest du noch dies probieren :
if defined datei (%datei%) else (Start "" "M:\Dokumente\Vorlage.doc")

Dein Code ist übrigens besser lesbar, wenn du die entsprechenden Tags aus der Formatierungshilfe benutzt.

Gruß
LotPings

Edit Bibers Hinweis ist zutreffender
holzholer
holzholer 04.06.2009 um 14:24:16 Uhr
Goto Top
Hallo,

dumme Frage, wenn du wissen möchtest ob eine Datei existiert, dann benutze doch gleich
IF EXIST %datei% ...

Grüße
Biber
Biber 04.06.2009 um 16:43:24 Uhr
Goto Top
Moin holzholer,

im Prinzip ja...
Aber in diesem Fall weder kürzer noch eleganter.
Wenn im oben beschriebenen Ablauf der Benutzer nach "4711" gesucht hat und keine Datei "4711what.ever" gefunden wird..

---> dann ist die Variable %datei% leer/nicht definiert.
Und die Zeile
IF EXIST %datei% [...machwas....]
... wird aufgelöst zu
IF EXIST [...machwas...]
---> Syntaxfehler
--> Diese Batchdatei wäre also auch nicht besonders fehlertolarant.
Sondern würde bei jedem Datei-nicht-gefunden-Fall [=einer von 2 möglichen Ergebnisfällen] hart abgrätschen.

Grüße
Biber
holzholer
holzholer 04.06.2009 um 16:59:20 Uhr
Goto Top
Stimmt, soweit hatte ich nicht gedacht.

Danke für die Erleuchtung.
Ludger
Ludger 04.06.2009 um 19:58:31 Uhr
Goto Top
Hallo Biber,

Volltreffer! Der Hauptfehler lag in dem Leerzeichen nach =

Ich habe den Code nach Deinen Vorschlägen geändert und es klappte sofort.

Deinen Hinweis auf die Formatierung werde ich beim nächsten Mal befolgen.

Vielleicht hast Du noch eine Idee, warum ich am Arbeitsplatz nicht antworten kann. Zu Hause klappt alles wunderbar.
In der Firma kann ich zwar neue Beiträge schreiben, aber nicht antworten. Das ist auch der Grund, warum mein Feedback so lange dauert.
Gibt es Sicherheitseinstellungen o. ä. was ich ändern müsste?
Ich habe diese Frage auch gestern direkt an den Support gestellt nur leider noch keine Antwort erhalten. Und da Ihr so flott seid könnte es ja sein, dass ich auf diesem Wege schneller zu Ziel komme.

Wie gesagt dies Problem ist für mich bestens gelöst.
Danke, Danke, Danke.

Ludger
Ludger
Ludger 04.06.2009 um 20:00:09 Uhr
Goto Top
Hallo Lotpings,

du hast recht die Lösung von Biber ist treffender, aber das Hauptproblem war tatsächlich das Leerzeichen nach =.
Da lagst du schon genau richtig.

Besten Dank an Euch beide.

Ludger
Ludger
Ludger 04.06.2009 um 20:03:40 Uhr
Goto Top
Dir auch vielen Dank für dein Mitdenken.
Der Ansatz von Biber hat mich bereits ans Ziel gebracht.
Sobald ich das Problem meines IE in der Fa gelöst habe (dass ich auch von dort antworten kann) werde ich zügiger zurückantworten.

Gruß

Ludger
Biber
Biber 04.06.2009 um 20:15:00 Uhr
Goto Top
Moin Ludger,

In der Firma kann ich zwar neue Beiträge schreiben, aber nicht antworten.
Das ist auch der Grund, warum mein Feedback so lange dauert.

-inoffizielle Antwort-

möglicherweise verhält sich Dein Browser ähnlich wie es auch schon andere berichtet haben und wie ich es auch schon erlebt habe: Die Buttons "Antworten", "Bearbeiten" "Zitieren" sind gar nicht zu sehen.
Die angezeigte Seite sieht aus, als wären die rechten 5 cm abgeschnitten und ein Scrollen nach rechts ist nicht möglich (bzw. nicht soweit, dass Buttons in Sicht kämen.

Wenn es dieses verhalten ist, dann ein funktionierender Workaround, der auch hier im Forum gepostet wurde:
Im Browser auf "Ansicht"->"Schriftgrad" gehen und dort das, was ohnehin eingestellt ist (meistens "Mittel") einfach bestätigen.

Seite wird neu aufgebaut - mit Buttons.

Sollte es etwas anderes bei Dir sein. bitte mach einen Beitrag in "Off Topic\Administrator.de Feedback" auf.

Grüße
Biber
bastla
bastla 04.06.2009 um 20:16:40 Uhr
Goto Top
@Biber
Interessanter Weise funktioniert die Zeile
if defined datei (%datei%) else (M:\Dokumente\Vorlage.doc)
nur im Batch nicht - und da ich natürlich nur kurz am Prompt getestet hatte ...

Hast Du eine Erklärung parat, warum dieses unterschiedliche Verhalten Batch / Direkteingabe auftritt?

Grüße
bastla
Biber
Biber 04.06.2009, aktualisiert am 18.10.2012 um 18:38:21 Uhr
Goto Top
Moin bastla,

das hatte ich schon mal im Workshop Batch for Runaways Part II gleich am Anfang (Punkt c) beschrieben.

Das ist ein Feature, vermute ich.... face-wink

Grüße
Biber
78632
78632 04.06.2009 um 20:52:14 Uhr
Goto Top
Feature?

Ist die Variable nicht definiert, erscheint im Batch folgende Fehlermeldung:
")" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Weiß der Geier, was sich die Praktikantinnen da wieder haben einfallen lassen. face-smile

Es funktioniert offenbar nur mit einem Mehrzeiler:
@echo off

set "datei=@echo Variable Datei ist definiert"  
rem set "datei="  
if not defined datei (goto :ausfuehren)
%datei% & goto :weiter
:ausfuehren
@echo Variable Datei ist nicht definiert
:weiter
pause

@Biber
Dein Beispiel nach c) funktioniert genauso wenig, jedenfalls nicht, wenn man reale Dateinamen einsetzt. Mit den Echo-Umgehungen habe ich das nicht probiert.
Aber das oben in Tags gepostete Geschnipsel habe ich mit realen Dateien ausprobiert, das funktioniert face-wink
Biber
Biber 04.06.2009 um 21:50:34 Uhr
Goto Top
Moin blablanik,

na ja, das Tutorial ist ja auch aus heutiger Sicht fast schon eine Jugendsünde...
damals hatte ich noch lange lockige blonde Haare und sogar mehrere.. *seufz*

Anyhow, Du hast natürlich Recht - der IF ""=="" -Vergleich geht daneben, wenn die Variable definiert ist UND zusätzlich auch noch Anführungszeichen und/oder Leerzeichen im Inhalt mit sich rumschleppt.

Demo am CMD-Prompt:
>set test123="d:\temp\test mit space.txt"  

>if "%Test123%"=="" (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123%  
"mit" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

>if [%Test123%]== (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123%  
Test123 hat Wert "d:\temp\test mit space.txt"  

>set "test123=d:\temp\test.txt"  

>if [%Test123%]== (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123%  
Test123 hat Wert d:\temp\test.txt

>if "%Test123%"=="" (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123%  
Test123 hat Wert d:\temp\test.txt

--> in einer wesentlich höheren Anzahl der Testfälle funktioniert die Verwendung von (eckigen Klammern) als "Ummantelung" der Variablen besser als das Einschließen in die naheliegenderen Anführungszeichen.

Also werde ich wohl mal das Beispiel im Tut dahingehend abändern.

Vielen Dank für den Hinweis
Biber