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 0
Vermutlich 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 directory
Scheitert 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:\Test
und 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.exe
aber nur sehr begrenzte Stringverarbeitungsfunktionen. Also ist das etwas umständlich.set "_P=%~1<<<"
%1
steht für das erste Argument mit dem das Batch-File aufgerufen wurde, genau so wie es angegeben wurde.%~1
ist 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_P
dann 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 vonfind
im Inhalt vonvar
und 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 directory
Das 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.exe
Batchfile 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.