Comment obtenir le nom de fichier uniquement sans chemin dans la ligne de commande Windows?

31
for /r %f in (*) do echo %f

Donne le nom du fichier de sortie ainsi que le chemin complet

\path\to\dir\<filename>

Comment obtenir juste le <filename>sans le chemin d'accès inclus? J'ai besoin d'utiliser cette chaîne de "nom de fichier".

Est-il également possible de procéder comme suit, une fois le nom de fichier acquis?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)
Geai
la source
3
Pour référence future, Microsoft dispose d'une référence en ligne Windows XP - AZ de référence de ligne de commande qui est toujours principalement applicable aux versions ultérieures. La documentation de la réponse que vous avez acceptée se trouve à la fin de la section sur la forcommande.
martineau
@martineau: Malheureusement, la page en ligne 'Windows XP - Référence de ligne de commande AZ' n'est plus en ligne (supprimée par Microsoft) et aucune alternative à cette documentation n'est encore disponible (pour autant que je puisse trouver des codumentations sur ' % ~ 'documentation des arguments)
PapaAtHome
@PapaAtHome: Heureusement, on peut toujours afficher la référence de la ligne de commande via la machine de renvoi de web.archive.org .
martineau

Réponses:

54

Utiliser %~nxfpour <filename>.<extension>.

Et oui, vous pouvez faire:

for /r %%f in (*) do (
echo "blah blah blah '%%~nxf'" >> blahblah_%%~nxf.txt
)

Voir 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.
Bob
la source
Très bonne réponse. Une idée comment je pourrais rechercher une sous-chaîne dans un chemin complet? Par exemple, je veux savoir si c: \ code \ myapp \ .git \ somefolder inclut le texte ".git".
Dale Barnard
1
Vous pouvez effectuer une recherche textuelle ou regex en redirigeant le chemin vers la commande findou findstr, par exemple echo %%f | find "\.git\" > NULou echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NUL, puis en vérifiant le niveau d'erreur avec la ifcommande. (regex findstr est très limité, c'est donc ma tentative d'imposer un début \et [soit une fin \ou une fin de chaîne]). Notez que cela if errorlevela des caprices avec fall-through, et vous ne pouvez probablement pas if %errorlevel%dans une boucle, vous devrez peut-être d' SetLocal EnableDelayedExpansionabord et ensuite à la if !errorlevel!place.
Bob
@DaleBarnard Envisagez également d'utiliser PowerShell - beaucoup moins de douleur et probablement des résultats plus cohérents.
Bob
Le bla bla me déroute, qu'est-ce qu'il est censé représenter? Comment le chemin complet du fichier et le nom du fichier extrait s'insèrent-ils dans cette réponse?
thebunnyrules
@thebunnyrules %~nxfest le nom du fichier, comme je l'ai dit dans la première phrase. Lorsque vous l'utilisez dans un fichier de commandes, vous devez doubler le %, ce qui en fait %%~nxf. Le blah blah blahprend simplement l'exemple dans la question et remplace le filenamebit par la %%~nxfsubstitution - les blahs ne sont que du remplissage et n'ont pas de signification particulière.
Bob
0

Je ne suis pas encore en mesure de commenter, mais je pense que les points suivants doivent être notés pour éviter toute confusion.

Bien qu'il fpuisse être utilisé comme nom de variable FOR, il est préférable d'utiliser une autre lettre pour éviter de la confondre avec la lettre de format f(qui, comme indiqué dans la réponse de Bob, renvoie le nom de chemin complet), ou au moins utiliser une majuscule F.

ÊTRE HYBRIDE
la source