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 defined ELSE funktioniert nicht in Batchanweisung

Frage Entwicklung Batch & Shell

Mitglied: Ludger

Ludger (Level 1) - Jetzt verbinden

04.06.2009, aktualisiert 18.10.2012, 11043 Aufrufe, 13 Kommentare

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
Mitglied: Biber
04.06.2009 um 12:17 Uhr
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

01.
.. 
02.
... 
03.
if NOT defined datei Set "datei=M:\Dokumente\Vorlage.doc" 
04.
 %datei% 
05.
REM .... oder [start "Fenstertitel" "%datei%" ]  
06.
REM ... oder welcher Aufruf auch immer... 
07.
....
Grüße
Biber
Bitte warten ..
Mitglied: LotPings
04.06.2009 um 12:22 Uhr
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
Bitte warten ..
Mitglied: holzholer
04.06.2009 um 14:24 Uhr
Hallo,

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

Grüße
Bitte warten ..
Mitglied: Biber
04.06.2009 um 16:43 Uhr
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
Bitte warten ..
Mitglied: holzholer
04.06.2009 um 16:59 Uhr
Stimmt, soweit hatte ich nicht gedacht.

Danke für die Erleuchtung.
Bitte warten ..
Mitglied: Ludger
04.06.2009 um 19:58 Uhr
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
Bitte warten ..
Mitglied: Ludger
04.06.2009 um 20:00 Uhr
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
Bitte warten ..
Mitglied: Ludger
04.06.2009 um 20:03 Uhr
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
Bitte warten ..
Mitglied: Biber
04.06.2009 um 20:15 Uhr
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
Bitte warten ..
Mitglied: bastla
04.06.2009 um 20:16 Uhr
@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
Bitte warten ..
Mitglied: Biber
04.06.2009, aktualisiert 18.10.2012
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....

Grüße
Biber
Bitte warten ..
Mitglied: 78632
04.06.2009 um 20:52 Uhr
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.

Es funktioniert offenbar nur mit einem Mehrzeiler:
01.
@echo off 
02.
 
03.
set "datei=@echo Variable Datei ist definiert" 
04.
rem set "datei=" 
05.
if not defined datei (goto :ausfuehren) 
06.
%datei% & goto :weiter 
07.
:ausfuehren 
08.
@echo Variable Datei ist nicht definiert 
09.
:weiter 
10.
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
Bitte warten ..
Mitglied: Biber
04.06.2009 um 21:50 Uhr
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:
01.
>set test123="d:\temp\test mit space.txt" 
02.
 
03.
>if "%Test123%"=="" (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123% 
04.
"mit" ist syntaktisch an dieser Stelle nicht verarbeitbar. 
05.
 
06.
>if [%Test123%]==[] (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123% 
07.
Test123 hat Wert "d:\temp\test mit space.txt" 
08.
 
09.
>set "test123=d:\temp\test.txt" 
10.
 
11.
>if [%Test123%]==[] (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123% 
12.
Test123 hat Wert d:\temp\test.txt 
13.
 
14.
>if "%Test123%"=="" (echo "Test123" ist nicht definiert) ELSE echo Test123 hat Wert %test123% 
15.
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
LAN, WAN, Wireless
Internetverbindung funktioniert erst nach ipconfig renew (6)

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

Windows Server
gelöst W2008 R2 msiinstaller funktioniert nicht mehr (5)

Frage von Alix zum Thema Windows Server ...

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

Frage von pablovic zum Thema C und C ...

Router & Routing
Transparenter Proxy funktioniert nicht? (3)

Frage von mrserious73 zum Thema Router & Routing ...

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 ...