2010-08-08 16 views
32

Existe-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 le langage de commande DOS BAT? Je suis d'accord: format c:\ est probablement un bon début, suivi par un CD Linux amorçable (en supposant que ces machines antiques ont un lecteur de CD - pas un donné). Mais supposons que nous avons seulement DOS ... (Cela signifie: pas Windows - pas même Windows 3.1, encore moins Windows 95, 98, NT, ME, XP, Vista, 7, etc.)Fichier DOS BAT équivalent à la commande Unix basename?

+2

'basename' conserve l'extension de fichier. C'est à dire. '/home/user/Desktop/test.txt 'devient' test.txt '. Est-ce la fonctionnalité que vous voulez, ou voulez-vous simplement 'tester'? – eldarerathis

+1

@eldarerathis: La commande Unix 'basename' peut supprimer une extension:' basename /some/where/file.txt .txt' renvoie 'file', ce qui est le résultat souhaité. L'extension en question est connue. –

+0

Ah, d'accord. Cela l'efface, alors. – eldarerathis

Répondre

40

Pour la ligne de commande

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

sortie: bar

Pour .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 @ciantic's version.

(Lectures: http://www.computerhope.com/forhlp.htm)

+1

L'URL vous gagne la 'réponse sélectionnée' - merci –

+0

J'ai essayé: FOR %% f IN (* .DAT) DO bcheck -y %% ~ nf dans mon script FIX.BAT, mais ça n'a pas marché! .. ~ n est un FOR extension disponible uniquement avec l'interpréteur de commandes WinXP cmd.exe. Je cours natif DOS 6.22 command.com qui ne supporte pas ~ extensions. Voir mon post précédent: http://stackoverflow.com/questions/3429032/how-can-i-supress-filename-extensions-at-the-command-line-interpreter-and-batch-f –

+1

'for/F% i dans ("c: \ foo \ bar space.txt") est-ce que @echo% ~ ni' affiche "bar", comment puis-je obtenir le "bar space.txt"? – Ciantic

2

Dans le FOR commande de boucle, vous pouvez utiliser %%~n.

23

développiez hobodave's et ars's 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. 
2

DOS 6,22 ne prend pas en charge% ~ nI pour les instructions de traitement par lots. Voici une solution de contournement au problème que j'ai présenté dans ma question initiale sur l'utilitaire 4.10 bcheck d'isql ne nécessitant qu'un nom de base, alors que dans l'utilitaire isql 2.10 bcheck fonctionnait avec star.star comme argument. J'ai créé le programme suivant QBASIC pour résoudre bVérifiez 4.10 nécessitant maintenant seulement basename au travail:

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 d'ACE pour extraire le nom de base de systables.dirpath et PRINT « bVérifiez -y », SysTables .dirpath

3

Je comprends que la réponse "vous ne pouvez pas" n'est pas assez bonne. Donc, si vraiment/a/à faire sous DOS en mode réel, alors le shell de commande 4DOS et des programmes d'accompagnement et de l'utiliser au lieu de COMMAND.COM

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

Je ne l'ai pas utilisé dans les années pour "basename", vous verrez qu'il y a une réponse en mode réel DOS à votre problème si vous utilisez 4DOS/à la place de COMMAND.COM

Le seul autre chemin de solution auquel je puisse penser est de trouver ou d'écrire un fichier .exe en mode réel qui exécute le nom de base.COMMAND.COM, même dans DOS 6.22 avec toutes ses commandes externes de support, était toujours un système incroyablement paralysé pour les scripts/fichiers batch. Notez que les prog de ligne de commande MinGW32 ne seront d'aucune aide. Tout cela est pour le mode protégé (Windows 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.

2

Sur la base de la réponse acceptée de hobodave comment vous pouvez utiliser la commande ici pour définir une variable dans un fichier batch:

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

Il utilise le premier argument en ligne de commande% 1, et définit la FN variables égal au nom de base (fichier.txt par exemple).

-1

solution de travail complète (même lorsque le chemin contient des espaces)

dans .bat fichiers

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

dans commande rapide utilisation % au lieu de %%

(thanks to @Ciantic)