¿Cómo obtener el nombre de archivo solo sin ruta en la línea de comando de Windows?


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

Da el nombre del archivo de salida junto con la ruta completa

\path\to\dir\<filename>

¿Cómo obtengo solo el <filename>sin la ruta incluida? Necesito usar esa cadena de 'nombre de archivo'.

Además, ¿es posible hacer lo siguiente una vez que se adquiere el nombre de archivo?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)

3
Para referencia futura, Microsoft tiene un Windows XP en línea: AZ de referencia de línea de comandos que aún es aplicable principalmente a versiones posteriores. La documentación en la respuesta que aceptó se encuentra al final de la sección del forcomando.
Martineau

@martineau: Desafortunadamente, la página en línea 'Windows XP - Referencia de línea de comando AZ' ya no está en línea (eliminada por microsoft) y una alternativa para esta documentación aún no está disponible (por lo que puedo encontrar alguna codificación en ' % ~ 'documentación del argumento)
PapaAtHome

@PapaAtHome: Afortunadamente, todavía se puede ver la referencia de la línea de comandos a través de la máquina wayback de web.archive.org .
martineau

Respuestas:


54

Usar %~nxfpara <filename>.<extension>.

Y sí, puedes hacer:

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

Ver 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.

Gran respuesta. ¿Alguna idea de cómo podría buscar una subcadena en una ruta completa? Por ejemplo, quiero saber si c: \ code \ myapp \ .git \ somefolder incluye el texto ".git".
Dale Barnard el

1
Puede realizar una búsqueda textual o de expresiones regulares canalizando la ruta al comando findo findstr, por ejemplo, echo %%f | find "\.git\" > NULo echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULy luego verificando el nivel de error con el ifcomando. (findtr regex es muy limitado, así que ese es mi intento de forzar un inicio \y un final \o una secuencia). Tenga en cuenta que if errorleveltiene peculiaridades con la caída, y probablemente no pueda if %errorlevel%dentro de un bucle, por lo que es posible que SetLocal EnableDelayedExpansionprimero necesite y luego en su if !errorlevel!lugar.
Bob

@DaleBarnard Además, considere usar PowerShell: mucho menos dolor y probablemente resultados más consistentes.
Bob

El bla bla me está confundiendo, ¿qué se supone que representa? ¿Cómo encaja la ruta completa del archivo y el nombre del archivo extraído en esta respuesta?
thebunnyrules

@thebunnyrules %~nxfes el nombre del archivo, como dije en la primera oración. Cuando lo usa dentro de un archivo por lotes, debe duplicar el %, haciéndolo %%~nxf. El blah blah blahsolo está tomando el ejemplo en la pregunta y reemplazando el filenamebit con la %%~nxfsustitución: los blahs son solo de relleno y no tienen un significado particular.
Bob

0

Todavía no puedo comentar, pero creo que se debe tener en cuenta lo siguiente para evitar confusiones.

Si bien fse puede usar como un nombre de variable FOR, es mejor usar otra letra para evitar confundirlo con el formato de letra f(que, como se indica en la respuesta de Bob, devuelve el nombre completo de la ruta), o al menos usar una mayúscula F.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.