DOS BAT file équivalent à la commande Unix basename?

y a-t-il un moyen facile d'accéder au nom de base (Nom de fichier sans extension) d'un nom de fichier DOS en utilisant la langue de la commande BAT DOS?

je suis d'accord: format c: est probablement un bon début, suivi d'un CD Linux amorçable (en supposant que ces machines anciennes ont un lecteur de CD - pas un donné). Mais faisons comme si on n'avait que DOS... (Cela signifie: pas Windows-Pas même Windows 3.1, encore moins Windows 95, 98, NT, ME, XP, Vista, 7, etc.)

35
demandé sur Ross Ridge 2010-08-08 06:30:36

8 réponses

Pour ligne de commande

for /F %i in ("c:\foo\bar.txt") do @echo %~ni

sortie: bar

For .Fichiers bat

set FILE="c:\foo\bar.txt"
for /F %%i in ("%FILE%") do @echo %%~ni

sortie: bar

p. S. si le chemin contient l'espace , utilisez dans la version de @ciantic .

(Pour Plus D'Information): http://www.computerhope.com/forhlp.htm )

43
répondu hobodave 2017-11-25 16:01:52

pour développer sur hobodave's et ars réponses, voici l'extrait pertinent de l'aide de la commande for :

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.
27
répondu Michael Burr 2017-05-23 12:02:16

en outre, la boîte à outils MKS a un utilitaire de nom de base...

http://www.mkssoftware.com/docs/man1/basename.1.asp

3
répondu shawndumas 2010-08-08 02:46:10

je comprends que la réponse "vous ne pouvez pas" n'est pas assez bon. Donc, si c'est vraiment/ doit être fait en mode réel DOS, alors récupérez la commande shell 4DOS et les programmes qui l'accompagnent et utilisez-la au lieu de COMMAND.COM

http://www.4dos.info/v4dos.htm

Je ne l'ai pas utilisé depuis des années, mais il était toujours / loin / mieux que COMMAND.COM si vous cherchez cette page: http://www.4dos.info/4batfaq.htm pour "basename" vous verrez qu'il y a une réponse de DOS en Mode réel à votre problème si vous utilisez 4DOS / instead / of COMMAND.COM

la seule autre solution que je puisse imaginer est de trouver ou d'écrire un Mode réel .exe qui exécute basename.

COMMAND.COM, même dans DOS 6.22 avec toutes ses commandes externes supportant, a toujours été un système incroyablement handicapé pour les scripts / fichiers batch. Notez que les programmes en ligne de commande MinGW32 ne seront d'aucune aide. Tout ça est pour Mode protégé (fenêtres 32 bits). Si vous l'essayez sous DOS, vous obtiendrez simplement le cryptique "ce programme ne peut pas être exécuté en mode DOS."ou quelque chose de similaire.

3
répondu WyrdestGeek 2011-11-17 23:24:30

dans le pour commande de boucle, vous pouvez utiliser %%~n .

2
répondu ars 2010-08-08 02:40:54

DOS 6.22 ne supporte pas %~nI dans les déclarations par lots. voici une solution au problème que j'ai présenté dans ma question originale au sujet de l'utilitaire 4.10 bcheck d'isql n'exigeant qu'un nom de base alors que dans isql 2.10 bcheck utility fonctionnait avec star.star comme argument. J'ai créé le programme QBASIC suivant pour résoudre bcheck 4.10 maintenant nécessitant seulement un nom de base pour fonctionner:

BatFile$ = "CHKFILE.BAT"
        IF INSTR(COMMAND$, "?") > 0 THEN
          PRINT
          PRINT "This program generates a batch file to check Informix files"
          PRINT "  -b  BBBB.BAT    this option is used to change the batch file name"
          PRINT "                  by default the batch file name is CHKFILE.BAT"
          PRINT
          SYSTEM
        END IF
        IF INSTR(COMMAND$, "-B") > 0 THEN
          BatFile$ = LTRIM$(MID$(COMMAND$, INSTR(COMMAND$, "-B") + 2)) + "  "
          BatFile$ = LEFT$(BatFile$, INSTR(BatFile$, " ") - 1)
        END IF

        OPEN BatFile$ FOR OUTPUT AS #2


        filename$ = DIR$("*.dat")
        IF LEN(filename$) = 0 THEN SYSTEM
        DO WHILE LEN(filename$) > 0
          PRINT #2, "bcheck -y", filename$
          filename$ = DIR$
        LOOP
        CLOSE
        SYSTEM

OU, on peut écrire un programme ACE pour extraire le nom de base de systables.dirpath et Imprimez "BCHECK-y", systèmes.dirpath

2
répondu Frank R. 2011-01-20 16:25:15

basé sur la réponse acceptée de hobodave voici comment vous pouvez utiliser la commande pour définir une variable dans un fichier batch:

for /F %%i in ("%1") do @set FN=%%~nxi

il utilise le premier argument de ligne de commande %1, et définit la variable FN égale au nom de base (file.txt par exemple).

2
répondu Matthew Beckler 2014-11-19 18:54:59

Full-solution de travail (même si le chemin contient des espaces)

dans .chauve-souris fichiers

for /F "delims=" %%i in (%FILE_path%) do @echo "%%~ni"

dans invite de commandes utiliser % au lieu de %%

( merci à @Ciantic )

-1
répondu T.Todua 2017-11-25 15:58:57