¿Cómo dividir el nombre de archivo de una ruta completa en lote?

¿Cómo puedo dividir el nombre de archivo de una ruta completa en scripts por lotes?

@echo off Set filename=C:\Documents and Settings\All Users\Desktop\Dostips.cmd For %%A in ("%filename%") do ( Set Folder=%%~dpA Set Name=%%~nxA ) echo.Folder is: %Folder% echo.Name is: %Name% 

Pero no me puedo atribuir el mérito de esto; Google encontró esto en http://www.dostips.com/forum/viewtopic.php?f=3&t=409

Parse un nombre de archivo del nombre completo de la ruta (por ejemplo, c: \ temp \ my.bat) a cualquier componente (por ejemplo, File.ext).

Una sola línea de código:

 For %%A in ("C:\Folder1\Folder2\File.ext") do (echo %%~fA) 

Puede cambiar ” C: \ Carpeta1 \ Carpeta2 \ Archivo.ext ” por cualquier ruta completa y cambiar ” %% ~ fA ” por cualquiera de las otras opciones que encontrará ejecutando “for /?” en el símbolo del sistema.

Código elaborado

 set "filename=C:\Folder1\Folder2\File.ext" For %%A in ("%filename%") do ( echo full path: %%~fA echo directory: %%~dA echo path: %%~pA echo file name only: %%~nA echo extension only: %%~xA echo expanded path with short names: %%~sA echo attributes: %%~aA echo date and time: %%~tA echo size: %%~zA echo drive + path: %%~dpA echo name.ext: %%~nxA echo full path + short name: %%~fsA) 

Script de lote independiente
Guardar como C: \ cmd \ ParseFn.cmd .

Agregue C: \ cmd a su variable de entorno PATH y úselo para almacenar todas las secuencias de comandos por lotes reutilizables.

 @echo off @echo ::___________________________________________________________________:: @echo :: :: @echo :: ParseFn :: @echo :: :: @echo :: Chris Advena :: @echo ::___________________________________________________________________:: @echo. :: :: Process arguements :: if "%~1%"=="/?" goto help if "%~1%"=="" goto help if "%~2%"=="/?" goto help if "%~2%"=="" ( echo !!! Error: ParseFn requires two inputs. !!! goto help) set in=%~1% set out=%~2% :: echo "%in:~3,1%" "%in:~0,1%" if "%in:~3,1%"=="" ( if "%in:~0,1%"=="/" ( set in=%~2% set out=%~1%) ) :: :: Parse filename :: set "ret=" For %%A in ("%in%") do ( if "%out%"=="/f" (set ret=%%~fA) if "%out%"=="/d" (set ret=%%~dA) if "%out%"=="/p" (set ret=%%~pA) if "%out%"=="/n" (set ret=%%~nA) if "%out%"=="/x" (set ret=%%~xA) if "%out%"=="/s" (set ret=%%~sA) if "%out%"=="/a" (set ret=%%~aA) if "%out%"=="/t" (set ret=%%~tA) if "%out%"=="/z" (set ret=%%~zA) if "%out%"=="/dp" (set ret=%%~dpA) if "%out%"=="/nx" (set ret=%%~nxA) if "%out%"=="/fs" (set ret=%%~fsA) ) echo ParseFn result: %ret% echo. goto end :help @echo off :: @echo ::___________________________________________________________________:: :: @echo :: :: :: @echo :: ParseFn Help :: :: @echo :: :: :: @echo :: Chris Advena :: :: @echo ::___________________________________________________________________:: @echo. @echo ParseFn parses a fully qualified path name (eg, c:\temp\my.bat) @echo into the requested component, such as drive, path, filename, @echo extenstion, etc. @echo. @echo Syntax: /switch filename @echo where, @echo filename is a fully qualified path name including drive, @echo folder(s), file name, and extension @echo. @echo Select only one switch: @echo /f - fully qualified path name @echo /d - drive letter only @echo /p - path only @echo /n - file name only @echo /x - extension only @echo /s - expanded path contains short names only @echo /a - attributes of file @echo /t - date/time of file @echo /z - size of file @echo /dp - drive + path @echo /nx - file name + extension @echo /fs - full path + short name @echo. :end :: @echo ::___________________________________________________________________:: :: @echo :: :: :: @echo :: ParseFn finished :: :: @echo ::___________________________________________________________________:: :: @echo. 
 @echo off Set filename="C:\Documents and Settings\All Users\Desktop\Dostips.cmd" call :expand %filename% :expand set filename=%~nx1 echo The name of the file is %filename% set folder=%~dp1 echo It's path is %folder% 

No sé mucho sobre los archivos por lotes, pero ¿no podría tener un archivo por lotes prefabricado copiado desde el directorio de inicio a la ruta que tiene que devolvería una lista de los nombres de los archivos y luego usaría ese nombre?

Aquí hay un enlace que creo que podría ser útil para hacer el archivo por lotes prefabricado.

http://www.ericphelps.com/batch/lists/filelist.htm

Continuando con el ejemplo anterior de Pete, para hacerlo directamente en la ventana de cmd, use un solo % , por ejemplo:

  cd c: \ test \ folder A 
para% X in (*) do echo% ~ nx X

(Tenga en cuenta que los archivos especiales como desktop.ini no se mostrarán).

También es posible redirigir la salida a un archivo usando >> :

  cd c: \ test \ folder A 
para% X in (*) echo +% ~ nx X >> c: \ test \ output.txt

Para ver un ejemplo real, supongamos que desea robocopiar todos los archivos de la carpeta A a la carpeta B (de forma no recursiva):

  cd c: \ test \ folder A
 para% X en (*) do robocopy.  "c: \ test \ folder B" "% ~ nx X " / dcopy: dat / copyall /v>>c:\test\output.txt 

y para todas las carpetas (recursivamente):

  cd c: \ test \ folder A
 para / d% X en (*) do robocopy "% X" "C: \ test \ folder B \% X" / e / copyall / dcopy: dat /v>>c:\test\output2.txt