2010-07-09 16 views
112

Tengo el siguiente archivo por lotes de Wikipedia:lotes: Retire extensión de archivo

@echo off 
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f 
) 
pause 

En los todos los archivos de bucle con el flv extensión consigo eco, pero quiero que el maquillaje algunas acciones con el archivo (s) donde necesito una vez el archivo sin la extensión y una vez con la extensión. ¿Cómo podría obtener estos dos?

He buscado soluciones pero no encuentro ninguna. Soy un verdadero novato en lotes ...

Respuesta

221

Usted puede utilizar %%~nf para obtener el nombre del archivo sólo como se describe en el referencia para for:

@echo off 
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf 
) 
pause 

Las siguientes opciones están disponibles:

 
Variable with modifier Description 

%~I      Expands %I which removes any surrounding 
         quotation marks (""). 
%~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     Expands path to contain short names only. 
%~aI     Expands %I to the file attributes of file. 
%~tI     Expands %I to the date and time of file. 
%~zI     Expands %I to the 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, 
         this modifier expands to the empty string.  
+0

Gran trabajo. Me ayudó. –

+2

Solo una nota rápida: en el ejemplo anterior ** %% f ** sería algo así como 'C: \ Users \ Admin \ Ordner \ foo.flv' y ** %% ~ nf ** le daría' foo' . Si quieres todo _except_ la extensión use ** %% ~ df %% ~ pf %% ~ nf ** que te daría 'C: \ Users \ Admin \ Ordner \ foo' – ehambright

13

También soy un extraño para ventanas cmd, pero trata de esto:

echo %%~nf 
8

Esta es una respuesta muy tarde, pero se me ocurrió esto a resolver un problema particular que tuve con DiskInternals LinuxReader añadiendo'.efs_ntfs a archivos que se guardan en los directorios que no son NTFS (FAT32):

@echo off 
REM %1 is the directory to recurse through and %2 is the file extension to remove 
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df 
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them 
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf" 
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf" 
echo. 
) 
pause 
+0

No estoy seguro de que responda el pedido pregunta, pero realmente me ayudó, ¡gracias! – matan7890

+1

@ matan7890 Verdadero; el op no especifica qué "quiero hacer algunas acciones con el (los) archivo (s)" [sic] implica, pero una de esas acciones puede ser cambiarles el nombre, en cuyo caso mi respuesta es una expansión de la respuesta aceptada. –

+0

Esto ayudó a un amigo mío que abrió un archivo adjunto y agregó '.encrypted' a todos sus archivos, junto con una demanda de rescate. Aparentemente, la secuencia de comandos de ataque debe haber sido un archivo por lotes que es el inverso de esto y agregó '.encrypted' a todos los archivos. – AwokeKnowing

23

En caso de que no exista el archivo que contiene su variable, el método FOR no funcionará. Un truco que podría utilizar, si se conoce la longitud de la extensión, está tomando una subcadena:

%var:~0,-4% 

la -4 significa que se truncarán los últimos 4 dígitos (presumiblemente .ext).

+0

Esto no funciona para mí (en Win8.1) - tal vez lo malinterprete cuando intento 'echo% f: ~ 0, -4% 'en el contexto del ejemplo utilizado en la pregunta. ¿Qué estoy haciendo mal? – Wolf

+2

Aparentemente eso funciona para variables "normales", no para variables FOR (o tal vez simplemente no conozco la sintaxis correcta).De todos modos, esto funcionará en el contexto del ejemplo OP: 'SET fl = %% f' y luego' echo% fl: ~ 0, -4% ' –

+1

Funciona para mí en Win10 para parámetros de línea de comando simples como% 1,% 2 etc. ¡Gracias! – deko

0

cómo eliminar más de una extensión? Digamos que mi archivo tiene extensión filename.abc.def.xyz.anything y quiero extraer solo el nombre de archivo.

Cuestiones relacionadas