Verzeichnis-Existenz

Praxis & Tipps | Tipps & Tricks

In einer Batchdatei unter Windows möchte ich abfragen, ob ein als Parameter angegebenes Verzeichnis existiert. Der erste Versuch mit if exist %1 liefert aber auch einen Treffer zurück, wenn eine Datei mit diesem Namen existiert. Wie unterscheide ich Dateien von Verzeichnissen?
In prähistorischen DOS-Zeiten prüfte man dazu, ob am angegebenen Ort die Pseudodateien für Geräte existierten, zum Beispiel if exist %1\con. In Verzeichnissen gibt es diese Datei ebenso wie prn, nul, aux, lpt1 und so weiter.

Allerdings hat Microsoft mit Windows XP einen neuen Bug eingeführt: Wenn der Pfadname genauso beginnt wie der Gerätename, behauptet if exist immer, dass das Gerät existiert. So liefert if exist c:\conto\con „wahr“ zurück, auch wenn es das Verzeichnis c:\conto gar nicht gibt.

Interessanterweise führt unter Vista und XP die Konstruktion if exist %1\… zum Erfolg. Das ist zwar nirgends dokumentiert, funktioniert aber zuverlässig.

Auf Netzwerkpfaden wie \\server\ordner\%1\… liefert das allerdings auch dann „wahr“, wenn eine Datei mit dem Namen existiert, da ist diese Lösung also unbrauchbar. Besser funktioniert:

dir /a:d %1\ >nul 2>nul && echo Verzeichnis

Das listet zunächst alle Verzeichnisse in %1 auf. In einem Verzeichnis gibt es auf jeden Fall die beiden Einträge . und .., also immer zwei Treffer; in Dateien gibt es keine Verzeichnisse. Da weder die Verzeichnisse noch die Fehlermeldung angezeigt werden sollen, schickt man sie mit den beiden Umleitungen in den Orkus. Das Doppelte & führt wie in der Unix-Shell dazu, dass der folgende Befehl nur ausgeführt wird, wenn dir keinen Fehler meldet. Das tut es aber, wenn in %1 kein Verzeichnis aufzufinden war, es sich folglich um eine Datei handelt. Diese Methode setzt wie die anderen voraus, dass man Leserechte in dem untersuchten Verzeichnis hat. Eine Lösung, wie man auch diese Einschränkung umgeht, würde den Rahmen der Hotline sprengen. Ein Skript finden Sie unter dem Soft-Link. (je)

Soft-Link

Anzeige