Unterscheidung ob Verzeichnis oder Datei mit Batch Datei
-
Hallo zusammen,
eine kurze Frage ist es möglich mit einer Batch Datei zu prüfen ob es sich um ein Verzeichnis oder Datei handelt ? Falls ja wie würde sowas aussehen bzw. wie sollte man anfangen ?
Vielen Dank für die Hilfe.
-
Auf Windows 10 funktioniert das:
@echo off setlocal :: strip trailing slash/backslash set "_P=%~1<<<" set "_P=%_P:\<<<=%" set "_P=%_P:/<<<=%" set "_P=%_P:<<<=%" if not exist "%_P%" ( echo "%_P%" does not exist. exit /b 9 ) if exist "%_P%\" ( echo "%_P%" seems to be a directory. exit /b 1 ) echo "%_P%" seems to be a file. exit /b 0Vermutlich auch auf älteren Windosen, hab's aber nicht probiert.
-
ps: Falls jemand ne einfachere Variante kennt bestimmte Zeichen am Ende eines Strings zu entfernen, lasst es mich wissen

-
@hustbaer schon mal vielen dank für die antwort
könntest du mir vielleicht kurz erklären was es
set "_P=%~1<<<"
set "_P=%_P:<<<=%"
set "_P=%_P:/<<<=%"
set "_P=%_P:<<<=%"
mit diesem teil auf sich hat ich würde das gerne lernen zu verstehen.
Danke ^^
-
IF EXIST %VAR%\NUL ECHO It's a directory
-
@Martin-Richter sagte in Unterscheidung ob Verzeichnis oder Datei mit Batch Datei:
IF EXIST %VAR%\NUL ECHO It's a directoryScheitert das nicht an eventuell fehlenden Rechten, da rein zu gucken?
-
@sandwichmaker
OK.
Die Sache mit dem Test ist dass du den File- bzw. Verzeichnisnamen ohne folgendem Slash/Backslash brauchst, also einfachc:\Testund nichtc:\Test\. Jetzt sind User aber gewohne dass sie auchc:\Test\angeben können. Also wäre es gut einen evtl. folgenden Slash/Backslash zu entfernen.Leider hat
cmd.exeaber nur sehr begrenzte Stringverarbeitungsfunktionen. Also ist das etwas umständlich.set "_P=%~1<<<"%1steht für das erste Argument mit dem das Batch-File aufgerufen wurde, genau so wie es angegeben wurde.%~1ist das selbe nur werden evtl. vorhandene Anführungszeichen entfernt. Das ist nötig damit man kein Problem mit den Anführungszeichen bekommt wenn man das Argument nicht 1:1 weiterverwenden kann. Die "<<<" dahinter sind ein Hilfskonstrukt um nur den letzten\entfernen zu können. Wichtig dabei ist dass<in einem Pfad nicht vorkomman darf.Wenn der User das Batch File mit
c:\Test\oder"c:\Test\"aufgerufen hat hat die Variable_Pdann also den Wertc:\Test\<<<.set "_P=%_P:\<<<=%" set "_P=%_P:/<<<=%" set "_P=%_P:<<<=%"Hier wird jetzt das "replace" Feature des Environment-Variable-Expansion Features benutzt.
%var%expandiert eine Environment-Variable. Wenn du statt dessen%var:find=replace%schreibst, dann sucht er zusätzlich alle Vorkommnisse vonfindim Inhalt vonvarund ersetzt sie mitreplace. Wir machen jetzt 3 Ersetzungen:\<<<mit einem Leerstring,/<<<mit einem Leerstring und zuletzt<<<mit einem Leerstring. Da<in einem Pfad wie gesagt nicht vorkommen darf, darf diese Sequenz nur am Ende des Strings auftauchen (wir haben ja<<<angehängt).D.h. beim ersten Replacement wird das
\<<<ausc:\Test\<<<entfernt wir haben dannc:\Test. Das zweite Replacement ist für den Fall dass der User normale Slashes verwedet. Und das dritte für den Fall dass kein Slash/Backslash an Ende war um den Original-String wiederherzustellen. Alles sehr messy, aber funktioniert. Natürlich nur so lange es max. EIN trailing Slash/Backslash ist, sobald es 2 oder mehr sind bleibt was übrig.
-
@Martin-Richter sagte in Unterscheidung ob Verzeichnis oder Datei mit Batch Datei:
IF EXIST %VAR%\NUL ECHO It's a directoryDas NUL braucht man nichtmal. Wenn man nur wissen will ob es ein Verzeichnis ist oder nicht dann reicht
IF EXIST %VAR%\ .... Bzw. idealerweiseIF EXIST "%VAR%\" ...wegen Leerzeichen und so.
-
@hustbaer Vielen Danke für deine Mühe!

-
@sandwichmaker Bitte

Ich hab mal für ein mittelgrosses Projekt ein Build- und Stagingskript als
cmd.exeBatchfile gemacht. War ne ziemliche Action, und da hab ich viele Tricks wie diesen gelernt. Wobei das mittlerweise nur minimal wertvoller ist als z.B. ALGOL zu können.