Existe-t-il un moyen simple d’obtenir le nom de base (nom de fichier sans extension) d’un nom de fichier DOS à l’aide du langage de commande DOS BAT?
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 - et non une donnée). Mais supposons que nous n’ayons que le DOS ... (c’est-à-dire: pas Windows - pas même Windows 3.1, encore moins Windows 95, 98, NT, ME, XP, Vista, 7, etc.)
Pour la ligne de commande
for /F %i in ("c:\foo\bar.txt") do @echo %~ni
sortie: bar
Pour les fichiers .bat
set FILE="c:\foo\bar.txt"
for /F %%i in ("%FILE%") do @echo %%~ni
sortie: bar
p.s. si chemin contient un espace, utilisez la version de @ ciantic .
(Lectures complémentaires: http://www.computerhope.com/forhlp.htm )
Pour développer les réponses de hobodave et ars , voici l'extrait d'aide pertinent 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.
En outre, le MKS Toolkit a un nom de base util ...
Je comprends que la réponse "vous ne pouvez pas" ne suffit pas. Donc, si cela doit/doit être fait en mode réel DOS, récupérez la commande 4DOS Shell et les programmes qui l’accompagnent et utilisez-le à la place de COMMAND.COM
http://www.4dos.info/v4dos.htm
Je ne l’avais pas utilisé depuis des années, mais c’était toujours/meilleur/mieux que COMMAND.COM Si vous effectuez une recherche sur cette page: http://www.4dos.info/4batfaq.htm pour "nom de base", vous verrez qu'il existe une réponse DOS en mode réel à 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 exécutant le nom de base.
COMMAND.COM, même sous DOS 6.22 avec toutes les commandes externes qu’il prenait en charge, était toujours un système incroyablement handicapé pour les scripts/fichiers de traitement par lots. Notez que les progs en 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 message crypté "Ce programme ne peut pas être exécuté en mode DOS." ou quelque chose de similaire.
DOS 6.22 ne prend pas en charge% ~ nI dans les instructions batch. Voici une solution de contournement au problème que j'ai présenté dans ma question initiale concernant l'utilitaire bcheck 4.10 d'isql ne nécessitant qu'un nom de base, alors que l'utilitaire bcheck isql 2.10 fonctionnait avec star.star comme argument. J'ai créé le programme QBASIC suivant pour résoudre bcheck 4.10 ne nécessitant plus qu'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 PRINT "BCHECK -y", systables.dirpath
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 sur le nom de base (fichier.txt par exemple).
Dans la commande POUR boucle, vous pouvez utiliser %%~n
.
dans les fichiers .bat
for /F "delims=" %%i in (%FILE_path%) do @echo "%%~ni"
dans command-prompt, utilisez %
au lieu de %%
( merci à @Ciantic )