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


  • Mod

    IF EXIST %VAR%\NUL ECHO It's a directory
    

  • Mod

    @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 einfach c:\Test und nicht c:\Test\. Jetzt sind User aber gewohne dass sie auch c:\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 Wert c:\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 von find im Inhalt von var und ersetzt sie mit replace. 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 \<<< aus c:\Test\<<< entfernt wir haben dann c:\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. idealerweise IF 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.


Log in to reply