Come dividere il nome file da un percorso completo in batch?

Come faccio a dividere il nome del file da un percorso completo nello script batch?

@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% 

Ma non posso prendermene il merito; Google lo ha trovato su http://www.dostips.com/forum/viewtopic.php?f=3&t=409

Analizzare un nome file dal nome del percorso completo (ad esempio c: \ temp \ my.bat) a qualsiasi componente (ad esempio, File.ext).

Singola riga di codice:

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

Puoi cambiare ” C: \ Folder1 \ Folder2 \ File.ext ” per qualsiasi percorso completo e modificare ” %% ~ fA ” per le altre opzioni che troverai eseguendo “per /?” al prompt dei comandi.

Codice elaborato

 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 batch autonomi
Salva come C: \ cmd \ ParseFn.cmd .

Aggiungi C: \ cmd alla variabile d’ambiente PATH e usalo per memorizzare tutti gli script batch riutilizzabili.

 @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% 

Non so molto sui file batch, ma non potreste avere un file batch pre-copiato dalla directory home al percorso che avete che restituirebbe un elenco dei nomi dei file e quindi usare quel nome?

Ecco un link che ritengo possa essere utile per creare il file batch pre-creato.

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

Continuando dall’esempio di Pete sopra, per farlo direttamente nella finestra di cmd, usa una singola % , ad esempio:

  cd c: \ test \ cartella A 
per% X in (*) fai echo% ~ nx X

(Nota che file speciali come desktop.ini non verranno visualizzati.)

È anche ansible redirect l’output in un file usando >> :

  cd c: \ test \ cartella A 
per% X in (*) fai echo% ~ nx X >> c: \ test \ output.txt

Per un esempio reale, supponendo che si desideri eseguire la robocopy di tutti i file dalla cartella-A alla cartella -B (non in modo ricorsivo):

  cd c: \ test \ cartella A
 per% X in (*) fai robocopy.  "c: \ test \ folder B" "% ~ nx X " / dcopy: dat / copyall /v>>c:\test\output.txt 

e per tutte le cartelle (in modo ricorsivo):

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